好好想想,你们在工作中,做过浮点数或者实数 是否 相等的判断?
先计算一下,测试结果如下:
奇不奇怪?
感觉奇怪就是把计算机原理课程还给老师了.
把它转成二进制来看看:
十进制0.1
二进制0.00011001100110011.(循环0011)
尾数为1.1001100010011001100..1100(共52位,除了小数京左边的1),指数为4(进制移码为0000000符号位为0
计算机存储为:0000000000 masuit. tklldgk tk
因为尾数最多52位,以实际存储的值为
0.0001001100110011001100110011001100110011001100110011001
看看十进制0.2
二进制0.001100110010011.(0环0011)
尾数为1.10011010010010010052位除了小数点方边的1)リ,指数为3(一进制移码为0000符号位为0
存储为:00000000110011001100110011.11001
尾数最多52位,所以实示行情的值000100000000000000
十进制0.3
按照上面相同的套路,得出来:
0.00110010011001100110011001100100110011001100110011,
结尾0011循环.
那么两者相加,得:
0.00011001100110011001100110011001100110011001100110011001+0.00110011001100110011001100110011001100110011001100
110011=0.01001100110011001100110011001100110011001100110011001100
也就是说只要0.3在最低位加的话就和0.2+0.1-样了,而尾数的最低位是第52位,再乘上-2的阶码,就是2的负54次方,这个数刚好就是:5,551115123125783e1
所以如果要判等0.1+0.2-0.3和0,不能直接用“==”,必须相减取绝对值!
补充知识:
在计算机中,小数有两种表示方式:定点数和浮点数。小数点隐含在某一个固定位置上的数据,就称为定点数。为了能正确的表示定点数,我们必需规定数据的位数和小数点的位置,以8位的数据为例,规定低3位是小数位,则一个定点数。定点表示法较为简单,但它表示的数据非常有限,无法表示数值很大的数据和数值很小的数据。为了表示更大范围的数据,数学上通常采用科学计数法,把数据表示成一个小数乘以一个以10为底的指数,像这样,把一个数的有效数字和指数部分在计算机中分别予以表示,就是浮点表示法。这种表示法,相当于数的小数点位置随比例因子的不同而在一定范围内自由浮动,改变指数部分的数值相当于改变小数点的位置。
在设计算法的时候,必需在精度和速度做好一定的权衡,可以采用32位的浮点数,具有更快的速度、更少的内存,也可能采用64位的双精度,具有更高的精度,但是需要更多的内存,速度也会有所降低。在涉及浮点数的算法中,尽量遵循下面几个原则,尽可能的减少由于浮点数造成的错误,或者减少误差: