点后面的std :: numeric_limits :: digits10 <float>和精度

时间:2017-03-02 16:12:37

标签: c++ floating-point

std::numeric_limits::digits10<float>返回7时,是否意味着我在点后面有7个有效数字或者左边有7个有效数字?

例如它就像:

1.123456
12.12345

或者就像

12.1234657

1 个答案:

答案 0 :(得分:2)

来自cppreference

  

std :: numeric_limits :: digits10的值是可以由类型T表示的基数为10的数字,没有变化,也就是说,具有这么多十进制数字的任何数字都可以转换为类型的值T并返回小数形式,不会因舍入或溢出而改变。对于base-radix类型,它是数字的值(浮点类型的数字-1)乘以log   10(基数)并向下舍入。

以后

  

标准的32位IEEE 754浮点类型具有24位小数部分(写入23位,一个隐含),这可能表明它可以表示7位小数(24 * std :: log10(2)是7.22),但是相对舍入误差是不均匀的,一些带有7位十进制数字的浮点值不能保持转换为32位浮点数和返回值:最小的正例是8.589973e9,在往返之后变为8.589974e9。这些舍入误差在表示中不能超过一位,而数字10计算为(24-1)* std :: log10(2),即6.92。四舍五入导致值为6。

这意味着,例如

cout << std::numeric_limits<float>::digits10; // 6
cout << std::numeric_limits<float>::digits; // 24

第二个是尾数中的位数,而第一个是可以在上述转换中安全表示的小数位数。

TL; DR:这是你的第一个案例。