Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python float_info:可以忠实表示的最大小数位数_Python - Fatal编程技术网

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

Python float_info:可以忠实表示的最大小数位数,python,Python,我正在阅读属性sys.float\u info.dig,该属性被描述为: 可以在浮点中忠实表示的最大小数位数 此示例显示了浮点表示在以下情况下是稳定的: import sys s = '3.14159265358979' format(float(s), '.15g') #Conversion float and back -> same value >>'3.14159265358979' 对于有效位数超过15位的字符串(由sys.float\u info.dig推导得出)

我正在阅读属性
sys.float\u info.dig
,该属性被描述为:

可以在浮点中忠实表示的最大小数位数

此示例显示了浮点表示在以下情况下是稳定的:

import sys
s = '3.14159265358979'
format(float(s), '.15g') #Conversion float and back -> same value
>>'3.14159265358979'
对于有效位数超过15位的字符串(由
sys.float\u info.dig
推导得出),结果会出现精度错误

s = '9876543211234567'      # 16 significant digits is too many!
format(float(s), '.16g')    # conversion changes value !!
>>'9876543211234568'
那么在这种情况下,“忠实地”是什么意思?这是否意味着,如果有效数字低于sys.float\u info.dig,我们始终保证不会出现精度错误?

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

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


在任何情况下,这并不意味着没有15位精度的错误。当我们组合数字时,我们仍然可以看到许多累积误差的问题。例如,二进制不能完美地表示分数1/3。试着加1/3,比如说3000次,你会看到预期结果1000.0的累积转移,这意味着如果你有一个字符串
s
表示表单的十进制浮点

 mantissa "e" exponent
在哪里

  • 尾数
    不超过15位

  • float(s)
    不会溢出到无穷大,下溢到0,也不会产生低于正常值的数字

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

关于“不产生低于正常值”部分,请注意:

>>> 3e-324
5e-324
很容易找到16位数字不起作用的示例,而且您已经找到了一个。但要证明它在15位数的情况下始终有效并不容易。有限浮点数是有理数的“块状”子集,其中可表示浮点数之间的间隔取决于大小。正确的证明通常需要查看每个可能的浮动范围,如下所示: