sholock 发表于 2023-3-20 16:23:53

二分法无法处理浮点数,出现断点如何解决

本帖最后由 kyra 于 2023-3-21 08:54 编辑

module NUMERTICAL
    implicit none
    real, parameter :: zero = 0.00001
    contains
    real function bisect(A,B)!这是声明bisect返回值为一个浮点数
    IMPLICIT NONE
    real A,B
    real C
    real FA
    real FB
    real FC
   
   
    C=(A+B)/2.0
    FC=func(C)
   
    do while (abs(fc)> zero)
      FA = func(A)
      FB = func(B)
      if(FA*FB < 0)then
            B=C
            C=(A+B)/2.0
      else
            A=C
            C=(A+B)/2.0
      end if
      FC = FUNC(C)
    end do
    bisect = C
    return
    end function
   
   
   
    real function func(X)
    implicit none
    real X
    FUNC = (X+3)*(X-3)
    return
    end function
    end module
   
    program main
    use NUMERTICAL
    implicit none
    real A,B
    real ANS
    do while(.true.)
      write(*,*) '输入两个猜测值'
      read(*,*)A,B
      if(func(A)*func(B)<0) exit
      write(*,*) "不正确的猜测"
    end do
   
    ANS=bisect(A,B)
    write(*,"('x=',F6.3)")ans
    stop
    end
   
当输入浮点数如2.1和4.1时就会显示出现断点,求助大佬如何解决

kyra 发表于 2023-3-21 08:49:03

二分法的判断条件弄错了。

(1) 若f(c)=0,则c就是函数的零点;
(2) 若f(a)·f(c)<0,则令b=c;
(3) 若f(c)·f(b)<0,则令a=c.
module NUMERTICAL
implicit none
real, parameter :: zero = 0.00001

contains

real function bisect(A,B) result(C)!这是声明bisect返回值为一个浮点数
    real A,B,FA,FB,FC
    C=(A+B)/2.0
    FC=func(C)
    do while (abs(fc)> zero)
      FA = func(A)
      FB = func(B)
      if(FA*FC < 0)then !//这里注意
      B=C
      else if( fc*fb < 0 ) then !//这里注意
      A=C
      end if
      C=(A+B)/2.0
      FC = FUNC(C)
    end do
end function bisect

real function func(X)
    real X
    func = (X+3)*(X-3)
end function func

end module NUMERTICAL

program main
use NUMERTICAL
implicit none
real A,B
do
    write(*,*) '输入两个猜测值'
    read(*,*)A,B
    if(func(A)*func(B)<0) exit
    write(*,*) "不正确的猜测"
end do
write(*,"('x=',F6.3)") bisect(A,B)
end program main

sholock 发表于 2023-3-31 16:19:54

弄懂了,谢谢
页: [1]
查看完整版本: 二分法无法处理浮点数,出现断点如何解决