c语言两个浮点数相乘,两个浮点变量相乘结果为什么不精确

浮点数精确运算的分析和解决办法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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值