Хотя это не имеет значения для примера вы дали, если бы была больше разницы в величинах операндов, замените
real t
с
double precision t
В противном случае, разница была бы усечен до доступного хранилища.
Для вашего примера точность констант слишком мала. Значение с плавающей запятой, указанное как у вас (8320671.25
и 8000000.00
), имеет тип real
, который определяет «одиночную точность»: используется 32-битное представление значений с плавающей запятой, которые эквивалентны 6 to 7 decimal digits of precision. Double precision
(с 1980-х годов) обычно представляет собой 64-битное представление с плавающей запятой, эквивалентное 15 to 17 decimal digits. Однако некоторые реализации могут выбрать для реализации double precision
то же, что и real
, хотя на совместимых с IEEE-754 машинах он обычно больше.
Чтобы сделать плавающей точкой постоянной двойной, написать D
для показателя:
t = 8320671.25D0 - 8000000.00
Заметим, что делает последующие операнды double precision
не будет работать из-за выражения печатая правил языка Fortran:
t = 8320671.25 - 8000000.00D0 ! Wrong! Result is "real"
или
t = 8320671.25 - 8D6 ! Wrong! Result is "real"
Первый пример выводит результат 320671.250
. Другие производят 320671.000
(если t
- тип real
) или 320671.00000000000
, если t
- тип double precision
.
С 1940-х годов Fortran был реализован на различных архитектурах. На некоторых из них (например, VAX) параметры компиляции командной строки определяют, какой тип аппаратного обеспечения используется для real
и для double precision
. Архитектура DEC имела по крайней мере четыре разновидности с плавающей запятой (F-Float, D-Float, G-Float и H-Float), все из которых были разработаны задолго до IEEE-754. См. this для некоторой исторической перспективы развития IEEE-754.
Thanks Evert! Это сработало! –
Предполагая, что _8 означает, что 8 байтов кажутся скорее угрозой портабельности, чем использование «двойной точности». – agentp
Чтобы быть справедливым, этот ответ был создан до того, как я добавил общий [tag: fortran]. Хотя он менее портативен (и даже если писать для gfortran, будучи портативным, это хорошо), это объясняет, почему возникает проблема. См. [M. Ответ С. Б.] (http://stackoverflow.com/a/27746544/3157076) для переносного способа. – francescalus