主题:[讨论]关于实数值的判断
shmech
[专家分:120] 发布于 2011-09-19 00:08:00
大家在程序中是如何判断实数值的?即一个实数是否等于某一个值?我看到一些程序中是直接if(realnum == 1.d0)这样来判断的,但也有人建议不要采用这种方法而是设定一个范围。请大家说说自己认为比较好的方法。
回复列表 (共10个回复)
沙发
weixing1531 [专家分:2580] 发布于 2011-09-19 00:21:00
if(abs(realnum - 1.d0) < 1.d-6)
板凳
shmech [专家分:120] 发布于 2011-09-19 13:49:00
3 楼
shmech [专家分:120] 发布于 2011-09-19 13:50:00
[quote]if(abs(realnum - 1.d0) < 1.d-6)[/quote]
您的意思就是用范围表示了?两种方法都有缺点,难以取舍啊
4 楼
cgl_lgs [专家分:21040] 发布于 2011-09-19 16:17:00
什么取舍啊,基本都是用范围,因为精度问题。。。
5 楼
bshine1225 [专家分:720] 发布于 2011-09-19 17:00:00
直接判断是否相等肯定是错的,实数都有截断误差的
6 楼
yeg001 [专家分:14390] 发布于 2011-09-19 17:17:00
为了不要碰运气地判断, 最好用范围判断, 理由如上面几位所说.
7 楼
shmech [专家分:120] 发布于 2011-09-19 18:06:00
minpack中的hybrd中就用了很多.eq.
8 楼
shmech [专家分:120] 发布于 2011-09-19 18:09:00
多谢各位,我的程序中一个函数值达到某个条件我就把它设为1.d0,这样可能用==判断好些,先试试。
9 楼
cgl_lgs [专家分:21040] 发布于 2011-09-19 21:07:00
如果确实是直接设置的一个确定的值,那可以用.eq.来判断。但此数值最好是能用二进制精确表示的,否则结果未知。
10 楼
yeg001 [专家分:14390] 发布于 2011-09-19 21:52:00
经运算的浮点数, 在不同机器, 或者不同编译命令优化下运算结果也可能不同的. 当然不是运算出来的结果如cgl_lgs兄说的赋值而来的或者就可以.
楼主自己看着办吧, 如果将来出错那这个地方可能是一个潜在的bug.
我来回复