Мы уже обсуждали, что в старых версиях Fortran существовало два реальных типа: реальный тип по умолчанию и тип с двойной точностью .
Тем не менее, Fortran 90/95 обеспечивает больший контроль над точностью реальных и целочисленных типов данных через спецификацию вида .
Добрый атрибут
Различные виды чисел хранятся по-разному в компьютере. Атрибут 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 предоставляет еще две встроенные функции для получения значения типа для требуемой точности целых и вещественных чисел —
- selected_int_kind (r)
- selected_real_kind ([p, r])
Функция selected_real_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
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —