1.01 + 2.01 = 3.02
2.01 * 2.01 = 4 0401 不知你注意没有,这个很寻常的等式,你如果将它放在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时