gfortran REAL не точен до 8 знаков после запятой

На этот вопрос ранее не было ответа. Я пытаюсь правильно представить реальное или любое число в Фортране. То, что gfortran делает для меня, далеко. Например, когда я объявляю переменную REAL pi=3,14159, fortran печатает pi = 3,14159012, а не 3,14159000. Смотри ниже:

PROGRAM Test
IMPLICIT NONE
REAL:: pi = 3.14159
PRINT *, "PI = ",pi
END PROGRAM Test

Это печатает:

PI = 3.14159012

Я мог бы ожидать что-то вроде PI = 3,14159000, поскольку REAL должен быть точным как минимум до 8 знаков после запятой.


person user3650887    schedule 19.05.2014    source источник
comment
гугл с плавающей запятой   -  person agentp    schedule 19.05.2014
comment
Пожалуйста, не начинайте опять одни и те же вопросы, вы должны предварительно существенно отредактировать его из закрытой версии! Вы уже получили предложения по использованию арифметики с двойной точностью.   -  person Vladimir F    schedule 19.05.2014


Ответы (2)


У меня хорошее настроение, поэтому я попытаюсь ответить на этот вопрос, который представляет собой базовые знания, которые можно легко найти в Google (как уже было указано в комментариях к этому и вашему предыдущему вопросу).


К счастью, Fortran предоставляет несколько действительно интересных встроенных функций, позволяющих получить некоторое представление о числах с плавающей запятой.

8 цифр, о которых вы говорите, являются эмпирическим правилом и могут быть связаны с функцией EPSILON(x), которая печатает наименьшее отклонение от 1, которое может быть представлено в выбранной модели (например, REAL4). Это значение на самом деле 1.19e-7, что означает, что ваша 8-я цифра, скорее всего, неверна. Пишу скорее всего потому, что некоторые числа можно представить точно.

В случае PI наименьшее представимое отклонение может быть напечатано с использованием встроенного SPACING(PI). Это показывает значение 2,38e-7, которое немного больше, чем эпсилон, и все еще допускает 7 правильных цифр.

Теперь, почему ваше значение PI сохраняется как 3.14159012? Когда вы сохраняете число с плавающей запятой, вы всегда сохраняете ближайшее представимое число. Используя значение интервала, мы можем получить возможные значения для вашего пи. Возможные числа и их отличия от вашего значения 3.14159:

3.14158988         1.20E-007
3.14159012        -1.18E-007
3.14159036        -3.56E-007

Как видите, 3.14159012 является ближайшим возможным значением к 3.14159 и поэтому сохраняется и печатается.

person Stefan    schedule 19.05.2014

Часто ошибаются две последние цифры. Это называется ошибкой с плавающей запятой.

Проверьте это: Неделя 1 - Лекция 2: Двоичное хранилище и контроль версий / Вещественные числа с фиксированной и плавающей запятой (9-08).mp4 @ https://class.coursera.org/scicomp-002/lecture

person bill    schedule 19.05.2014
comment
Он доступен только тем, у кого есть учетная запись Coursera и кто подписался на этот курс. Найдите что-нибудь открытое. - person Vladimir F; 19.05.2014