Fortran 90 выдает неверный ответ, выдает 0, когда ответ должен быть 1. Я что-то упускаю из виду?

Вот код Fortran 90, который я написал. Это функция, которую я использую в большом коде, но получаю неверные результаты.

Я знаю, что математически ответ должен быть 1 (или близок к 1 из-за вычислений), но мой результат ответа равен 0.

Я делаю что-то неправильно? Есть ли что-то, чего я не знаю?

Вот мой код, сохраненный как test.f90, который я компилирую и запускаю в Windows gfortran:

program main
    implicit none

    real*8 :: y, t

    t = 0.0
    y = (1/3)*exp(5*t) + (2/3)*exp(-t) + t*t*exp(2*t)

    print*, 'y= ', y

end program main

person Oscar Alvarez    schedule 16.02.2020    source источник
comment
Хорошая работа по созданию небольшого воспроизводимого тестового кода. Добро пожаловать в СО!   -  person Ross    schedule 17.02.2020


Ответы (1)


Fortran считает, что 1/3 и 2/3 равны нулю. вы должны добавить точку к вашим числам:

program main
implicit none

real*8 :: y, t

t = 0.0
y = (1./3.)*exp(5*t) + (2./3.)*exp(-t) + t*t*exp(2*t)

print*, 'y= ', y
person Valometrics.com    schedule 16.02.2020
comment
Этот ответ действительно следует расширить: почему 1/3 и 2/3 равны 0 и почему помогают десятичные дроби? Кроме того, есть явно дубликаты, на которые можно указать... - person Ross; 17.02.2020
comment
Кроме того, 2./3. обычно представляют собой вещественные числа с одинарной точностью, что означает, что результат будет неточным по сравнению с 2._dp/3._dp, где dp — соответствующий тип. Использование *8* не рекомендуется. - person Ross; 17.02.2020
comment
взгляните на эту статью: math.hawaii.edu/~hile /fortran/fort3.htm#double - person Valometrics.com; 17.02.2020