C++中 float 精度详解

站在巨人的肩膀上


分析


一个浮点数(Floating Point Number)由三个基本成分构成:

  • 符号(Sign)
  • 阶码(Exponent)
  • 尾数(Mantissa)

通常,可以用下面的格式来表示浮点数:

SPM存储

其中 S 是符号位,P 是阶码,M 是尾数

对于 32 位的单精度浮点型如下:

32浮点数

可以看出,它有 1位符号位,8位指数,23位尾数

举例,对于 16.5(10)
对于10 进制的数字 16.5
表示成 2 进制为 00010000.1
表示成科学记数法 1.00001 × 2^4

又因为 Number = (-1)^S × 1.M × 2^(E-127)


S(2) = 0
P(10) = 127 + 4 = 131
M(2) = 0000 1000 0000 0000 0000 000

立即推:
P(2) = 1000 0011

那么在内存的表示为:

符号位指数尾数
0100000110000 1000 0000 0000 0000 000

结论


  1. 在转换过程中由于需要往右移位, 可见对于float数整数部分越大,小数部分的精度就越低
  2. 对float数来说有效数字约为7位(223约等于107),所以整数部分占的位数越多,小数部分的精度就越低,当整数部分超过9999999后小数部分已经完全无精度了
  • 17
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值