Фортран форматирование чисел - PullRequest
0 голосов
/ 31 января 2012

Я использую Intel® Visual Fortran Compiler Professional Edition 11.1, и когда я запускаю этот код

program Console1
implicit none

real(8), parameter:: iterations = 1000.d0
real(8), parameter:: maximum = 0.02d0

integer, parameter:: outfile=1

real(8) force, dforce
integer i

dforce = maximum/iterations
force = 0.d0

open (unit=outfile,file="results.txt",action="write",status="replace")
do i=0,int(iterations)
    write(outfile, *) force
    force = force+dforce
enddo
close(outfile)

endprogram

, файл results.txt представляет собой беспорядок, окончательное число равно 1.999999999999952E-002, а не 2.д-2

что я делаю не так?Спасибо!

Ответы [ 3 ]

9 голосов
/ 31 января 2012

Не снова! Числа с плавающей точкой не являются точными представлениями действительных чисел. Период.

Что должен знать каждый компьютерщик об арифметике с плавающей точкой .

4 голосов
/ 31 января 2012

Ни вы, ни Фортран не делаете ничего плохого. Вы сталкиваетесь с фундаментальным пределом вычислительной арифметики.

Компьютер хранит число «сила» с ограниченной точностью, в двоичном виде, а не в виде точной дроби или десятичной дроби. Точное значение никогда не используется - достигается только определенный уровень точности.

Ссылка, которую опубликовал kemiisto, объясняет более подробно, но главное, что можно извлечь из нее, это мантра: «действительные (с плавающей запятой) числа никогда не бывают точными». Это означает, что всякий раз, когда вам нужно сравнить два вещественных числа, если они не имеют какого-то очень специфического значения, такого как ноль, вам нужно проверить, не близки ли они, а не идентичны.

Вы можете изменить способ вывода номера в конце, используя спецификаторы формата: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html

2 голосов
/ 31 января 2012

Чтобы ответить на вопрос:

оператор

write(outfile, *) force

использует то, что Фортран называет «направленным на список вводом-выводом».'*' Оставляет компилятору возможность определить разумный формат для вывода переменной 'force'.Если вы хотите контролировать формат вывода, используйте дескрипторы редактирования Fortran.Например,

write(outfile, '(f6.3)') force

отформатирует число в соответствии с дескриптором 'f6.3' - что не совсем то, что хочет спрашивающий, но я надеюсь, что это поставит ее на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...