Fortran 90的奇怪行为

时间:2016-10-17 17:44:28

标签: fortran fortran90 gfortran

program main
call findbracket(x0, a, b)
end program

function f(x)
double precision x,f
f = x
end function

subroutine findbracket(x0,a,b)
double precision x0, a, b
double precision fa, fb
double precision dx
dx = 0.001d0
x0 = 1.0d0
a = x0
b = x0
print*, a, b
print*, f(a)
print*, f(b)

do
fa = f(a)
fb = f(b)

print*, "what is fa", fa
print*, "what is fb", fb
a = a - dx

if (fa*fb < 0) then
        exit
end if
print*, b, dx
b = b + dx
if (fa*fb < 0) then
        exit
end if

dx = dx*2

end do

end subroutine 

我正在编写一个解决给定函数f(x)的根的程序。在这一点上,我只是想检查我是否为每一步获得了正确的值,我发现了一些错误。为简单起见,我有f(x)= x作为函数,我期望程序打印f(a)= 1.0和f(b)= 1.0,但输出是f(a)= 1.8750000000000000和f(b )= 0.0000000000000000。另外,虽然我将a和b都设置为等于x0,但它似乎是a = 1.0000002381857485并且b = 1.0000000000000000。任何人都可以解释为什么会这样吗?我可能会错过一些愚蠢的东西,但我找不到它。我感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

将这些行添加到子程序

subroutine findbracket(x0,a,b)
double precision x0, a, b
double precision fa, fb
double precision dx

interface
    function f(x)
    double precision x,f
    end function
end interface

然后你应该得到f(x)的正确值。

编辑:

该接口使函数f(x)在子例程中可见(和可用)。