Fortran Coder

标题: 如何比较real类型变量和0.0? [打印本页]

作者: 静待花开    时间: 2022-11-10 09:58
标题: 如何比较real类型变量和0.0?
我是按照公式来写一部分判断的代码。
原公式大意是这样:(1)变量a=0,执行公式1,计算变量S。(2)变量a>0,执行公式2,计算变量S。(3)变量a<0,执行公式3,计算变量S。
简单来讲,就是根据变量a的情况,选择不同公式来计算变量S。

我感觉代码里,似乎并不能直接写成下面这样:
real(kind=4)   a, S

IF(a==0.0)Then
    S=...(省略此处的公式)
ElseIF(a>0.0)Then
    S=...(省略此处的公式)
ElseIF(a<0.0)Then

   S=...(省略此处的公式)
End IF

就想了解一下,大家在遇到这种情况时,是如何做这样的比较的?是将变量a如何与0做比较的?real类型不可能恰好等于0,感觉严格等于0的情况似乎永远不可能成立。看到有些说,在C里是用 a 与1E-5做比较,a的绝对值小于1E-5的话,就认为a=0了,请问大家在Fortran里有没有遇到这种情况?是采用哪种方法?

作者: 布衣龙共    时间: 2022-11-10 10:43
一般来说浮点数不做相等判断。
但是对于 0.0 是个特殊,可以做  a==0.0 的判断。
也不是说几乎不可能成立,还是有可能成立的。(因为浮点数能精确的表达0.0,而其他一些数字,例如1.6,浮点数不能精确表达)
如果三个公式的差别非常大,确实容易因浮点数误差导致“混沌”现象。

有时候会用 if( abs(a)<eps) 之类的方式(eps取一个较小的数,例如1.0e-6)来代替,但还是要看具体情况。a 的数值来源怎样?经过了什么计算,大概的取值范围如何。
综合考虑是直接判断,还是用 abs<eps 的方式,具体eps的取值等。
作者: 静待花开    时间: 2022-11-10 14:48
布衣龙共 发表于 2022-11-10 10:43
一般来说浮点数不做相等判断。
但是对于 0.0 是个特殊,可以做  a==0.0 的判断。
也不是说几乎不可能成立, ...

嗯嗯,感谢,基本明白了。我的程序里,变量a也是变化的,每次循环计算,它都会有一个新值,据我对程序的了解,是绝不可能刚好计算出来a=0.0,所以我觉得==0.0的这种判断是永远不可能成立 。所以还是按您说的,要综合考虑。非常感谢了,又学了一招。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2