Реальный тип данных Fortran 90
Простой вопрос Подобный вопрос был там, но я не получил тот, который ищу.
Я просто проверял пределы реального типа данных в Fortran 90 (используя компилятор ifort), причина в том, что мой реальный код может достичь этого предела. Чтобы проверить, я просто дал параметр mval1 (см. Код) и умножил на 2. В руководстве ifort говорится, что максимальное значение, которое он может принять, составляет 10E38, а мое значение намного меньше этого. Но во время печати он принимает случайные цифры в конце (вывод дан внизу). Может ли кто-нибудь помочь мне через это
PROGRAM TEST
IMPLICIT NONE
REAL(KIND=8), PARAMETER :: mval1 = 1073E12
REAL(KIND=8) :: j
j = real(2*mval1)
PRINT *, j,mval1
END PROGRAM TEST
Выход
2.146000005234688E+015 1.073000002617344E+015
1 ответ
Два момента, чтобы добавить к комментарию, который вы уже имели.
Один: в Intel Fortran real(kind=8)
переменные такие же, как числа двойной точности IEEE-754, и максимальное положительное значение 1.797693134862316E+308
, Для чисел с плавающей запятой IEEE одинарной точности, Intel Fortran real(kind=4)
максимальное значение 3.4028235E+38
который примерно ваш 10E38
,
Два: Ваша декларация
REAL(KIND=8), PARAMETER :: mval1 = 1073E12
присваивает значение реального вида по умолчанию mval1
, Я не знаю, какие у вас настройки компилятора по умолчанию, но проверьте, что произойдет, если вы измените эту строку на
REAL(KIND=8), PARAMETER :: mval1 = 1073E12_8
который явно заявляет, что литерал имеет kind=8
,
Ответ на вопрос, который вы не совсем задаете, и который вам не совсем дают другие комментарии, таков: арифметика с плавающей запятой сложна, и программисты, которые ее используют, должны ознакомиться хотя бы с основными приемами. Статья в Википедии о числах с плавающей точкой и арифметике - хорошая отправная точка для вашего самообразования. Все, что кто-либо говорит вам, игнорируйте статью Голдберга. Что должен знать каждый компьютерщик об арифметике с плавающей точкой, пока вы не начнете пытаться реализовать свои собственные числа и арифметику с плавающей точкой.