float_info:可以忠实表示的最大十进制数字数



我正在阅读属性sys.float_info.dig,该属性被描述为:

可以在浮点数中忠实表示的最大十进制数字数;

这个例子展示了浮点表示在以下情况下是稳定的:

import sys
s = '3.14159265358979'
format(float(s), '.15g') #Conversion float and back -> same value
>>'3.14159265358979'

对于具有超过15个有效数字的字符串(由sys.float_info.dig推导),结果将进入精度错误。

s = '9876543211234567'      # 16 significant digits is too many!
format(float(s), '.16g')    # conversion changes value !!
>>'9876543211234568'

那么在这种情况下,">忠实"是什么意思呢?这是否意味着如果有效数字低于sys.float_info.dig我们始终可以保证不会有精度误差?

">

忠实地"仅表示内部表示仍然可以正确区分人类打算使用该数字数量的 10^n 个数字。 在这个特定示例中,这意味着对于所有10^15 个数字,计算机将正确地将其每个内部值四舍五入为特定的、人类预期的 15 位数字。

当我们添加一个数字时,它无法再区分所有的组合:它没有 10^16 个位序列。 在这种情况下,相邻的数字被映射到相同的位模式;在转换回来时,我们不知道几种可能性中的哪一种是原始的,转换例程选择最接近二进制表示的那种。

无论如何,这并不意味着 15 位精度不会有错误。 当我们组合数字时,我们仍然可以看到很多累积误差的问题。 例如,二进制不能完美地表示分数 1/3。 尝试将 1/3 相加,比如说三千次,您将看到预期结果 1000.0 的累积转移

这意味着如果你有一个字符串s表示形式的十进制浮点数

mantissa "e" exponent

哪里

  • mantissa不超过 15 位数字

  • float(s)不会溢出到无穷大,不会溢出到 0,也不会产生次正规数

然后打印float(s)到 15 位有效数字将生成一个字符串,表示与s表示的相同数学值。 这意味着对于任何大于 15 的整数,这种冗长的混乱并不总是正确的。

关于"不产生亚正常"部分,请看:

>>> 3e-324
5e-324

很容易找到 16 位数字不起作用的示例,并且您已经找到了一个。 但是要证明它总是适用于15 位数字并不容易。 有限浮点数是有理数的"块状"子集,其中可表示浮点数之间的间隙根据大小而变化。 正确的证明通常需要查看浮点数的每个可能范围,如下所示:

http://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/