Fortran Coder

查看: 2351|回复: 2
打印 上一主题 下一主题

[数值问题] 如何比较real类型变量和0.0?

[复制链接]

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
跳转到指定楼层
楼主
发表于 2022-11-10 09:58:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是按照公式来写一部分判断的代码。
原公式大意是这样:(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里有没有遇到这种情况?是采用哪种方法?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

54

帖子

0

主题

0

精华

实习版主

F 币
653 元
贡献
214 点

元老勋章新人勋章

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

有时候会用 if( abs(a)<eps) 之类的方式(eps取一个较小的数,例如1.0e-6)来代替,但还是要看具体情况。a 的数值来源怎样?经过了什么计算,大概的取值范围如何。
综合考虑是直接判断,还是用 abs<eps 的方式,具体eps的取值等。

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
板凳
 楼主| 发表于 2022-11-10 14:48:17 | 只看该作者
布衣龙共 发表于 2022-11-10 10:43
一般来说浮点数不做相等判断。
但是对于 0.0 是个特殊,可以做  a==0.0 的判断。
也不是说几乎不可能成立, ...

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 03:15

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表