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