Fortran - Números
Os números em Fortran são representados por três tipos de dados intrínsecos -
- Tipo inteiro
- Tipo real
- Tipo complexo
Tipo Inteiro
Os tipos inteiros podem conter apenas valores inteiros. O exemplo a seguir extrai o maior valor que poderia ser mantido em um número inteiro normal de quatro bytes -
program testingInt
implicit none
integer :: largeval
print *, huge(largeval)
end program testingInt
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
2147483647
Observe que o huge()função fornece o maior número que pode ser mantido pelo tipo de dados inteiro específico. Você também pode especificar o número de bytes usando okindespecificador. O exemplo a seguir demonstra isso -
program testingInt
implicit none
!two byte integer
integer(kind = 2) :: shortval
!four byte integer
integer(kind = 4) :: longval
!eight byte integer
integer(kind = 8) :: verylongval
!sixteen byte integer
integer(kind = 16) :: veryverylongval
!default integer
integer :: defval
print *, huge(shortval)
print *, huge(longval)
print *, huge(verylongval)
print *, huge(veryverylongval)
print *, huge(defval)
end program testingInt
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
Tipo Real
Ele armazena os números de ponto flutuante, como 2.0, 3.1415, -100.876, etc.
Tradicionalmente, havia dois diferentes real tipos: o tipo real padrão e double precision tipo.
No entanto, o Fortran 90/95 oferece mais controle sobre a precisão dos tipos de dados reais e inteiros por meio do kind especificador, que estudaremos em breve.
O exemplo a seguir mostra o uso de tipo de dados real -
program division
implicit none
! Define real variables
real :: p, q, realRes
! Define integer variables
integer :: i, j, intRes
! Assigning values
p = 2.0
q = 3.0
i = 2
j = 3
! floating point division
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
end program division
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
0.666666687
0
Tipo Complexo
Isso é usado para armazenar números complexos. Um número complexo possui duas partes: a parte real e a parte imaginária. Duas unidades de armazenamento numérico consecutivas armazenam essas duas partes.
Por exemplo, o número complexo (3,0, -5,0) é igual a 3,0 - 5,0i
A função genérica cmplx()cria um número complexo. Ele produz um resultado cujas partes reais e imaginárias são de precisão única, independentemente do tipo dos argumentos de entrada.
program createComplex
implicit none
integer :: i = 10
real :: x = 5.17
print *, cmplx(i, x)
end program createComplex
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
(10.0000000, 5.17000008)
O programa a seguir demonstra aritmética de números complexos -
program ComplexArithmatic
implicit none
complex, parameter :: i = (0, 1) ! sqrt(-1)
complex :: x, y, z
x = (7, 8);
y = (5, -7)
write(*,*) i * x * y
z = x + y
print *, "z = x + y = ", z
z = x - y
print *, "z = x - y = ", z
z = x * y
print *, "z = x * y = ", z
z = x / y
print *, "z = x / y = ", z
end program ComplexArithmatic
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
(9.00000000, 91.0000000)
z = x + y = (12.0000000, 1.00000000)
z = x - y = (2.00000000, 15.0000000)
z = x * y = (91.0000000, -9.00000000)
z = x / y = (-0.283783793, 1.20270276)
Alcance, precisão e tamanho dos números
O intervalo de números inteiros, a precisão e o tamanho dos números de ponto flutuante dependem do número de bits alocados para o tipo de dados específico.
A tabela a seguir exibe o número de bits e intervalo para inteiros -
Número de bits | Valor máximo | Razão |
---|---|---|
64 | 9.223.372.036.854.774.807 | (2 ** 63) -1 |
32 | 2.147.483.647 | (2 ** 31) -1 |
A tabela a seguir exibe o número de bits, o menor e o maior valor e a precisão dos números reais.
Número de bits | Maior valor | Menor valor | Precisão |
---|---|---|---|
64 | 0,8E + 308 | 0,5E-308 | 15–18 |
32 | 1.7E + 38 | 0,3E – 38 | 6-9 |
Os exemplos a seguir demonstram isso -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+40
y = 3.73e+40
z = x * y
print *, z
end program rangePrecision
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
x = 1.5e+40
1
Error : Real constant overflows its kind at (1)
main.f95:5.12:
y = 3.73e+40
1
Error : Real constant overflows its kind at (1)
Agora vamos usar um número menor -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+20
y = 3.73e+20
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
Infinity
0.402144760
Agora vamos observar o underflow -
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e-30
y = 3.73e-60
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
y = 3.73e-60
1
Warning : Real constant underflows its kind at (1)
Executing the program....
$demo
0.00000000E+00
Infinity
O especificador de tipo
Na programação científica, muitas vezes é necessário saber o alcance e a precisão dos dados da plataforma de hardware na qual o trabalho está sendo feito.
A função intrínseca kind() permite consultar os detalhes das representações de dados do hardware antes de executar um programa.
program kindCheck
implicit none
integer :: i
real :: r
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
end program kindCheck
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
Integer 4
Real 4
Complex 4
Você também pode verificar o tipo de todos os tipos de dados -
program checkKind
implicit none
integer :: i
real :: r
character :: c
logical :: lg
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
print *,' Character ', kind(c)
print *,' Logical ', kind(lg)
end program checkKind
Quando você compila e executa o programa acima, ele produz o seguinte resultado -
Integer 4
Real 4
Complex 4
Character 1
Logical 4