c语言浮点数如何精确计算,浮点数精确运算的分析和解决办法

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时

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值