Числа в Фортране представлены тремя внутренними типами данных —
- Целочисленный тип
- Реальный тип
- Сложный тип
Целочисленный тип
Целочисленные типы могут содержать только целочисленные значения. В следующем примере извлекается наибольшее значение, которое может храниться в обычном четырехбайтовом целом числе:
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
2147483647
Обратите внимание, что функция large () дает наибольшее число, которое может содержаться конкретным целочисленным типом данных. Вы также можете указать количество байтов, используя спецификатор вида . Следующий пример демонстрирует это —
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 2147483647
Реальный тип
Он хранит числа с плавающей запятой, такие как 2.0, 3.1415, -100.876 и т. Д.
Традиционно существовало два разных реальных типа: реальный тип по умолчанию и тип двойной точности .
Однако Fortran 90/95 обеспечивает больший контроль над точностью реальных и целочисленных типов данных с помощью спецификатора вида , который мы вскоре рассмотрим.
В следующем примере показано использование реального типа данных —
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
0.666666687 0
Комплексный тип
Это используется для хранения комплексных чисел. Комплексное число состоит из двух частей: действительной части и мнимой части. Два последовательных цифровых запоминающих устройства хранят эти две части.
Например, комплексное число (3,0, -5,0) равно 3,0 — 5,0i
Универсальная функция cmplx () создает комплексное число. Это приводит к тому, что действительная и мнимая части имеют одинаковую точность, независимо от типа входных аргументов.
program createComplex implicit none integer :: i = 10 real :: x = 5.17 print *, cmplx(i, x) end program createComplex
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
(10.0000000, 5.17000008)
Следующая программа демонстрирует арифметику комплексных чисел —
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
(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)
Диапазон, точность и размер чисел
Диапазон целых чисел, точность и размер чисел с плавающей запятой зависит от количества битов, выделенных для конкретного типа данных.
В следующей таблице показано количество битов и диапазон целых чисел —
Количество бит | Максимальное значение | причина |
---|---|---|
64 | 9.223.372.036.854.774.807 | (2 ** 63) -1 |
32 | 2147483647 | (2 ** 31) -1 |
В следующей таблице показано количество бит, наименьшее и наибольшее значение, а также точность для действительных чисел.
Количество бит | Наибольшее значение | Наименьшее значение | точность |
---|---|---|---|
64 | 0.8E + 308 | 0.5E-308 | 15-18 |
32 | 1.7E + 38 | 0.3e-38 | 6-9 |
Следующие примеры демонстрируют это —
program rangePrecision implicit none real:: x, y, z x = 1.5e+40 y = 3.73e+40 z = x * y print *, z end program rangePrecision
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
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)
Теперь давайте использовать меньшее число —
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Infinity 0.402144760
Теперь давайте посмотрим, как опустится
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
y = 3.73e-60 1 Warning : Real constant underflows its kind at (1) Executing the program.... $demo 0.00000000E+00 Infinity
Добрый Спецификатор
В научном программировании часто необходимо знать диапазон и точность данных аппаратной платформы, на которой выполняется работа.
Встроенная функция kind () позволяет вам запрашивать детали представления данных оборудования перед запуском программы.
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Integer 4 Real 4 Complex 4
Вы также можете проверить вид всех типов данных —
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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —