У вас есть несколько проблем.
Прежде всего, вы не инициализируете expseries
.Вы должны установить его до цикла.Прямо сейчас результат совершенно произвольный, поскольку начальное значение expseries
не определено.
Во-вторых, ваша переменная nfactexp
переполнена.32-разрядные целые числа, которые вы, вероятно, используете, допускают только числа до 2 147 483 647. Кроме того, (inputexp**aa)
может переполниться.Хотя вы не можете исправить переполнения для всех входов, используя конечное количество битов, вы можете расширить вычисляемую область.Вычисляя каждый expterm
с использованием последнего, как expterm = expterm / aa * inputexp
, вы можете получить наибольший диапазон.
Вышеуказанное изменение также означает, что вы больше не будете избыточно вычислять факторные термины и уменьшать возведение в степень для умножения, что ускоряет выполнение кода.
Кроме того, abs
в условии while
-loop не требуется, поскольку expterm
всегда неотрицателен.
См. кодниже:
program taylor
implicit none
real :: inputexp, exptaylor, expseries
real, parameter :: accuracy = 1.0e-10
integer :: aa
write(*,*) "Write the value of the input of the exponential taylor series"
read(*,*) inputexp
exptaylor = 1 ! The first term is constant
expseries = 1 ! The first term is already included
aa = 0 ! Term index, i.e. 0 for the constant
do while (exptaylor > accuracy)
aa = aa + 1
! Use the previous value of exptaylor.
! Just scale it with the one more inputexp to get the x**n
! correct, and divide by aa for the factorial.
exptaylor = exptaylor / aa * inputexp
expseries = exptaylor + expseries
enddo
Write(*,*) "The number of terms of the series, N", aa
Write(*,*) "The value of the exponential according to the taylor series", expseries
end program