Фортран - точность чисел
Мы уже обсуждали, что в старых версиях Фортрана было два real типы: реальный тип по умолчанию и double precision тип.
Однако Fortran 90/95 обеспечивает больший контроль над точностью вещественных и целочисленных типов данных через kind спецификация.
Добрый Атрибут
Разные числа по-разному хранятся внутри компьютера. ВkindАтрибут позволяет вам указать, как номер хранится внутри. Например,
real, kind = 2 :: a, b, c
real, kind = 4 :: e, f, g
integer, kind = 2 :: i, j, k
integer, kind = 3 :: l, m, n
В приведенном выше объявлении реальные переменные e, f и g имеют большую точность, чем реальные переменные a, b и c. Целочисленные переменные l, m и n могут хранить большие значения и иметь больше цифр для хранения, чем целочисленные переменные i, j и k. Хотя это зависит от машины.
пример
program kindSpecifier
implicit none
real(kind = 4) :: a, b, c
real(kind = 8) :: e, f, g
integer(kind = 2) :: i, j, k
integer(kind = 4) :: l, m, n
integer :: kind_a, kind_i, kind_e, kind_l
kind_a = kind(a)
kind_i = kind(i)
kind_e = kind(e)
kind_l = kind(l)
print *,'default kind for real is', kind_a
print *,'default kind for int is', kind_i
print *,'extended kind for real is', kind_e
print *,'default kind for int is', kind_l
end program kindSpecifier
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
default kind for real is 4
default kind for int is 2
extended kind for real is 8
default kind for int is 4
Запрос размера переменных
Существует ряд встроенных функций, которые позволяют запрашивать размер чисел.
Например, bit_size(i)внутренняя функция определяет количество бит, используемых для хранения. Для действительных чиселprecision(x) встроенная функция, возвращает количество десятичных цифр точности, а range(x) внутренняя функция возвращает десятичный диапазон экспоненты.
пример
program getSize
implicit none
real (kind = 4) :: a
real (kind = 8) :: b
integer (kind = 2) :: i
integer (kind = 4) :: j
print *,'precision of real(4) =', precision(a)
print *,'precision of real(8) =', precision(b)
print *,'range of real(4) =', range(a)
print *,'range of real(8) =', range(b)
print *,'maximum exponent of real(4) =' , maxexponent(a)
print *,'maximum exponent of real(8) =' , maxexponent(b)
print *,'minimum exponent of real(4) =' , minexponent(a)
print *,'minimum exponent of real(8) =' , minexponent(b)
print *,'bits in integer(2) =' , bit_size(i)
print *,'bits in integer(4) =' , bit_size(j)
end program getSize
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
precision of real(4) = 6
precision of real(8) = 15
range of real(4) = 37
range of real(8) = 307
maximum exponent of real(4) = 128
maximum exponent of real(8) = 1024
minimum exponent of real(4) = -125
minimum exponent of real(8) = -1021
bits in integer(2) = 16
bits in integer(4) = 32
Получение доброй ценности
Fortran предоставляет еще две встроенные функции для получения значения kind для требуемой точности целых и действительных чисел:
- selected_int_kind (r)
- selected_real_kind ([p, r])
Функция selected_real_kind возвращает целое число, которое является значением параметра типа kind, необходимым для заданной десятичной точности p и диапазона десятичной экспоненты r. Десятичная точность - это количество значащих цифр, а диапазон десятичной экспоненты определяет наименьшее и наибольшее представимое число. Таким образом, диапазон составляет от 10-r до 10 + r.
Например, selected_real_kind (p = 10, r = 99) возвращает значение вида, необходимое для точности 10 десятичных знаков и диапазона от 10-99 до 10 + 99.
пример
program getKind
implicit none
integer:: i
i = selected_real_kind (p = 10, r = 99)
print *,'selected_real_kind (p = 10, r = 99)', i
end program getKind
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
selected_real_kind (p = 10, r = 99) 8