"浮点数判等"完美的解决方案吗?
2015/6/29
描述: 在各种语言中,由于遵循了浮点数标准,导致在"浮点数判等"使用"== !="都是错误的
措施: 目前看到的都是floatNum1 - floatNum2 > 一个精度标准,如果把浮点数转换为int(int判等很简单),则会引起许多意料之外的"隐式转换"错误. 前一种则让人感觉不完美.
难道没有完美的解决方案吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
浮点数在计算中途的任何时刻,其有效数字的位数都是固定的。都用不着举很复杂的例子:
对于计算机的浮点数,只不过是十进制换成了二进制而已,本质上没有区别。
实际上从数学的角度上,加减乘除幂等各种运算,实际上都极易引起有效数字的剧烈膨胀:
1E10 - 1
,有效数字从1瞬间涨到9)从信息的角度来讲,数学运算极易直接导致信息熵的增长。即你需要更多的信息量来把这个数表达准确。信息熵增长,而一个浮点数的存储空间却永远不会变化,那么精度的损失就是必然的。
而计算又是无情的。有效数字越算越多,那么不可信的数字也会越算越多。哪怕是最末尾只有1位不可信——平方就是两位,立方就是4位。
也就是说,浮点数的反复运算最终只会产生3种结果:
在以上这些前提下,机械比较浮点数每个数位的
==
运算符实际上必然撞到无效数字的存储区,造成“末尾误差部分数字不一致”推翻“前边有效数字部分一致”的错误判断。这自然是不可行的。
数学是完美的,但机器总是近似的,我们人类要充分的理解和尊重他。能通过研究和设计,把误差的扩散控制在可容忍的范围之内,索取到所需精度的结果,就已经是一件莫大的恩惠。
在理解这个过程的前提下,形式不是什么性命攸关的问题。想满足人类视觉观感的完美欲,说真的,其实并不算难:
==
运算符cmp(f1, f2, precision = 1e-5)
==
比较浮点数的误用楼上的答案已经很明确了,没有。
当然,如果你是在Mathematica中编程,那么实数可以判相等。。
举个简单的例子吧,ln(e)在数学上是等于1的,但是如果用计算机来算,e是近似的,ln的计算也是近似的(不然要么存无限位数要么计算无限的时间),因此结果当然是近似的,肯定不等于1,所以需要设定一个误差。
你可以用python输出一下0.1+0.2看看结果。。。。