Несоответствие типов данных в Фортране

Мы написали элементарный алгоритм на Фортране 95 для вычисления градиента функции (пример которого прописан в коде), используя центральные различия, дополненные процедурой, известной как экстраполяция Ричардсона.

function f(n,x)
! The scalar multivariable function to be differentiated

integer :: n
real(kind = kind(1d0)) :: x(n), f

f = x(1)**5.d0 + cos(x(2)) + log(x(3)) - sqrt(x(4))

end function f
!=====!
!=====!
!=====!

program gradient
!==============================================================================!
! Calculates the gradient of the scalar function f at x=0using a finite        !
! difference approximation, with a low order Richardson extrapolation.         !
!==============================================================================!

parameter (n = 4, M = 25)
real(kind = kind(1d0)) :: x(n), xhup(n), xhdown(n), d(M), r(M), dfdxi, h0, h, gradf(n)

h0 = 1.d0
x  = 3.d0

! Loop through each component of the vector x and calculate the appropriate
! derivative
do i = 1,n
! Reset step size
h = h0

    ! Carry out M successive central difference approximations of the derivative
do j = 1,M
        xhup = x
        xhdown = x
        xhup(i) = xhup(i) + h
        xhdown(i) = xhdown(i) - h
        d(j) = ( f(n,xhup) - f(n,xhdown) ) / (2.d0*h)
    h = h / 2.d0
    end do

    r = 0.d0
    do k = 3,M      r(k) = ( 64.d0*d(k) - 20.d0*d(k-1) + d(k-2) ) / 45.d0
        if ( abs(r(k) - r(k-1)) < 0.0001d0 ) then
        dfdxi = r(k)
            exit
        end if
    end do

    gradf(i) = dfdxi
end do

! Print out the gradient
write(*,*) " "
write(*,*) " Grad(f(x)) = "
write(*,*) " "
do i = 1,n
    write(*,*) gradf(i)
end do

end program gradient

В одиночной точности он работает нормально и дает мне достойные результаты. Но когда я пытаюсь изменить двойную точность, как показано в коде, я получаю сообщение об ошибке при попытке скомпилировать утверждение о том, что оператор присваивания

d(j) = ( f(n,xhup) - f(n,xhdown) ) / (2.d0*h)

производит несоответствие типовreal(4)/real(8), Я пробовал несколько различных объявлений двойной точности, добавляя каждую подходящую константу двойной точности в коде с помощьюd0и я получаю одну и ту же ошибку каждый раз. Я'м немного озадачен относительно того, как функцияf возможно производит единственное число точности.

Ответы на вопрос(1)

Ваш ответ на вопрос