天涯明月刀功力上1万7:有关判断浮点数相等的问题

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/29 16:37:20
我初学C++,老师讲课的时候说比较浮点数的时候要用诸如a-b<="一个一定精度的小数",不能直接用a==b,请问是为什么呢?如果直接比较了会出现什么问题呢?
谢谢!

最关键是浮点数实际上是二进制的"科学计数法", 每个十进制的数化成二进制小数时, 与我们想像的可能差别比较大. 一个十进制不循环的小数, 可能在二进制中实际是循环小数, 只能用近似值来表示. 所以二进制比较相等时要小心. 另外, 比如, 我们在日常计算时, 把10000个0.1加起来是1000, 而在用浮点数计算时, 0.1是近似的, 加10000次以后误差就会放大, 而不是1000了, 所以用浮点数做循环条件时也要注意.

其实这不是C/C++的问题. 浮点数均如此. 在PC上用的浮点数格式如单精度, 双精度, 都有这个问题.

总之, 时时记住整型是准的, 浮点型是近似的.

因为机内数是用二进制表示的,我们输入的数是十进制的。十进制数化为二进制数并非无限精确的,它的末位有截断误差。

浮点数在机内用尾数和指数表达,单精度和双精度尾数和指数的字长还不一样。

判断两浮点数相等要比较尾数和指数。尾数和指数都相等,两数才算相等。

float 0.1f 不等于 double 0.1l

所以在比较两数相等时要用
if ( fabs(a-b) < 1.0E-10 )
这种形式来比较。

浮点数在c/c++里面并非是非常准确的,比如你定义一个浮点数,1.0,那么这个浮点数的实际的值可能是1.000001
也可能是1.00002,不确定,所以两个你定义的看似相等的浮点数实际上并不相等。

只能判断是否在精度内相等

楼上说的很对,如是整数的话就可以直接比了