当std::numeric_limits::digits10<float>
返回7时,是否意味着我在点后面有7个有效数字或者左边有7个有效数字?
例如它就像:
1.123456
12.12345
或者就像
12.1234657
答案 0 :(得分:2)
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:这是你的第一个案例。