program prob_1
implicit real*8(a-h, o-z)
f(x) = x**2-cos(x)
df(x) = 2*x+sin(x)
x0 = 0, x1 = 1
do i = 1, 3
if (f((x0+x1)/2) < 0)
x0 = (x0+x1)/2
else
x1 = (x0+x1)/2
end do
print *,"x = ", x
end program
Run Code Online (Sandbox Code Playgroud)
我刚开始使用 Fortran 90。现在我使用的是 Code::blocks,但我不知道错误存在于哪一行。
我想问题是f((x0+x1)/2) < 0但实际上不知道真正的错误是什么。这里有什么问题?
请注意,语句 functions,即 OP 使用的函数定义,已过时。
B.3.4 语句函数
- 语句函数受到许多非直观限制,并且是潜在的错误源,因为它们的语法很容易与赋值语句的语法混淆。
- 内部函数是语句函数的一种更通用的形式,并完全取代了它。
来源:F2018标准
此外REAL*8,这种形式的符号或任何内容从未成为任何 Fortran 标准的一部分(请参阅此处):
我建议将代码重写为:
program prob_1
implicit none
double precision :: x1,x0
integer :: i
x0 = 0; x1 = 1
do i = 1, 3
if (f((x0+x1)/2.0D0) < 0) then
x0 = (x0+x1)/2.0D0
else
x1 = (x0+x1)/2.0D0
endif
end do
print *,"x = ", (x0+x1)/2.0D0
contains
function f(x)
double precision, intent(in) :: x
double precision :: f
f = x**2-cos(x)
end function f
function df(x)
double precision, intent(in) :: x
double precision :: df
df = 2.0D0*x+sin(x)
end function df
end program
Run Code Online (Sandbox Code Playgroud)