float_info:可以忠实表示的最大小数位数

时间:2018-01-25 01:11:40

标签: python

我正在阅读被描述为:{/ p>的属性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,我们始终保证不存在精度错误?

2 个答案:

答案 0 :(得分:4)

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

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

在任何情况下,意味着没有15位精度的错误。当我们组合数字时,我们仍然可以看到许多累积错误的问题。例如,二进制不能完美地表示1/3分数。尝试加1/3,比方说,三千次,你会看到1000.0的预期结果累计转移

答案 1 :(得分:2)

这意味着如果你有一个字符串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/