浮点数精确运算的分析和解决办法1。01+2。01=3。022。01*2。01=40401不知你注意没有,这个很寻常的等式,你如果将它放在C++中,Java中,Basic中,它居然是不成立的。计算机在开玩笑吗?噢,对了,隐约记得这好象是浮点数的问题,似乎很多很多年前,老师说过。
还有某位姓林的先生在某本书里提过=0的判断。嗯,如果你不遇到此问题,那你完全可以把它抛到火星上去,可惜,偶不好彩,这样的问题,被俺遇到了。唉!why?how?没办法,硬着头皮,从头开始。一:为何不成立?Why?这得从浮点数的在计算机内的存储开始说起,我这里闲话少说。
我们只谈双精度double数(至于float,基本上是五十步和一百步的区别)。双精度数在计算机内的表示方式是:(三部分组成)符号(正或负)阶码(2的N次幂)尾数(大于等于1小于2的数)比如:-(符号)1。01(尾数)*2~1(N=1)=-2。
02具体到计算机的存储单元:双精度数共占8字节(64bit)符号位(占1个bit)阶码(11个bit)尾数(52个bit)解释一下:符号位:0表示正1表示负阶码:是一个偏移量,1023的偏移量,它的1023相当于0,小于1023时为负,大于1023时为正,如:10000000001表示指数为1025-1023=2,表示真值为2^2。
好了,知道了原理,我们开始分析上述等式为何为不等。(相应数的存储值,可以简单用C语言的指针方式取出)1。01表示为:0011111111110