C++中 float 精度详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34719188/article/details/83351918

站在巨人的肩膀上


分析


一个浮点数(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

那么在内存的表示为:

符号位 指数 尾数
0 10000011 0000 1000 0000 0000 0000 000

结论


  1. 在转换过程中由于需要往右移位, 可见对于float数整数部分越大,小数部分的精度就越低
  2. 对float数来说有效数字约为7位(223约等于107),所以整数部分占的位数越多,小数部分的精度就越低,当整数部分超过9999999后小数部分已经完全无精度了

猜你喜欢

转载自blog.csdn.net/qq_34719188/article/details/83351918