Як встановити подвійні значення точності у Фортран


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.


Правильно, це має бути стандартний підхід.
Ondřej Čertík

І як часто люди насправді повинні сліпо змінювати точність своїх програм, не проходячи процедуру за процедурою і тестуючи? Основна причина використання _dpсхеми полягає в тому, щоб точність була чітко визначена переносним способом.
ja72

12

Ви оголосили змінні як подвійну точність, але ви ініціалізували їх з єдиними значеннями точності.

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

X=1.0d0
Y=1.0d-1

Відповідь Баррона нижче - це ще один спосіб зробити буквальну подвійну точність, з тією перевагою, що вона дозволяє згодом змінити точність змінних.


1
Я думаю, що слід використовувати метод 1.0_dp, описаний у публікації нижче.
Ondřej Čertík

1
Я другий коментар @ OndřejČertík - відповідь Баррона найкраща.
ОскарБ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.