Как установить значения двойной точности в Фортране

10

Недавно я столкнулся со странной проблемой с FORTRAN95. Я инициализировал переменные X и Y следующим образом:

X=1.0
Y=0.1

Позже я складываю их вместе и печатаю результат:

1.10000000149012

После изучения переменных кажется, что 0,1 не представляется в двойной точности с полной точностью. Есть ли способ избежать этого?

Пол
источник

Ответы:

21

Другой способ сделать это - сначала явно указать желаемую точность в переменной, используя встроенную функцию SELECTED_REAL_KIND, а затем использовать ее для определения и инициализации переменных. Что-то вроде:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

Хорошим преимуществом этого является то, что вы можете сохранить определение dpв модуле, а затем в USEтом модуле, где это необходимо. Теперь, если вы когда-нибудь захотите изменить точность вашей программы, вам нужно всего лишь изменить определение dpв этом месте вместо того, чтобы искать и заменять все D0s в конце инициализации вашей переменной. (Именно поэтому я бы рекомендовал не использовать 1.0D-1синтаксис для определения Y, как это было предложено. Это работает, но затрудняет поиск и изменение всех экземпляров в будущем.)

Эта страница на Fortran Wiki дает хорошую дополнительную информацию о SELECTED_REAL_KIND.

Barron
источник
Это верно, это должен быть стандартный подход.
Ондржей Чертик
И как часто людям действительно приходится слепо менять точность своих программ, не проходя процедуру за процедурой или тестирование? Основная причина использования _dpсхемы заключается в том, чтобы точность была четко определена портативным способом.
ja72
12

Вы объявили переменные с двойной точностью, но инициализировали их значениями с одинарной точностью.

Вы могли бы написать:

X=1.0d0
Y=1.0d-1

Ответ Баррона ниже - это еще один способ сделать буквальную двойную точность, с тем преимуществом, что он позволяет вам изменить точность ваших переменных в более позднее время.

Дэн
источник
1
Я думаю, что следует использовать метод 1.0_dp, описанный в посте ниже.
Ондржей Чертик
1
Второй комментарий @ OndřejČertík - самый лучший ответ Баррона.
ОскарБ