Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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中轻松处理浮点错误?_Python_Floating Accuracy - Fatal编程技术网

如何在python中轻松处理浮点错误?

如何在python中轻松处理浮点错误?,python,floating-accuracy,Python,Floating Accuracy,我正在生成一个数组,其中包含非常相似但不相等的值,这是由于浮点不准确。以下是数组开头的示例元素: 我希望在固定位置切片这些数字以删除它们(对于我的代码来说,在更大的上下文中,这些不准确的情况不会发生是至关重要的)。我曾尝试使用0b111.1111111(=7.9921875)对其进行位掩码,但python显然不支持浮动上的&。我试着对它们进行移位,将它们转换成整数,然后使用&,但我就是做不到。 现在,我想知道,是否有一种简单的方法可以进行位掩码浮动,或者python中是否有另一种方法,可以在特

我正在生成一个数组,其中包含非常相似但不相等的值,这是由于浮点不准确。以下是数组开头的示例元素:

我希望在固定位置切片这些数字以删除它们(对于我的代码来说,在更大的上下文中,这些不准确的情况不会发生是至关重要的)。我曾尝试使用
0b111.1111111(=7.9921875)
对其进行位掩码,但python显然不支持浮动上的
&
。我试着对它们进行移位,将它们转换成整数,然后使用
&
,但我就是做不到。


现在,我想知道,是否有一种简单的方法可以进行位掩码浮动,或者python中是否有另一种方法,可以在特定位置后对浮动进行切片,或者解决这个问题。

一种方法,尽管精度略有降低,但是将其舍入。例如,使用以下命令:

i=5/3
印刷品(一)
i=圆形(i,10)
印刷品(一)
这可能会打印以下内容:

1.6692
1.66666666666

如何使用?这种类型可以精确地表示小数,不像
float
Fraction
s是精确的,
Decimal
的精度也比
float
高,如果您使用32位python或32位浮点,您可以通过切换到64位来获得更高的精度。@np8:32位浮点将无法显示所示的值,例如1.6666651508和1.6666651493。这只是掩盖了问题。它并没有纠正它,而是留下了一个更难发现的问题。这是因为,除非程序正在处理的数字中有一些十进制模式(在所示的示例数字中不存在),否则我们可以预期计算出的浮点值与由
舍入
引起的十进制舍入点之间没有相关性。当两个数字落在其中一个舍入点的不同侧面时,
舍入(i,10)
将产生不同的结果,因此此“解决方案”失败。然而,这种情况可能很少发生,以至于在测试中会被忽略。例如,在
round(i,10)
的舍入值在1和2之间变化时,有10^10个点。显然希望相同的两个样本号相差20497 ULP。在1和2之间有2^52个ULP。因此,在大约20497•10^10/2^52这样的情况下,差值将跨越一个舍入点。这是4.55%。因此,我们不希望在测试中发现问题,例如产生OP显示的样本结果的测试。@EricPostphil据我所知,您对解决方案的问题是,例如
round(1.66666655,7)(=1.6666665)
round(1.6666666656,7)(=1.666666666)
会产生不同的结果?如果这是唯一的问题,那对我来说就没问题了,因为误差在第10位之前几乎从未出现过,我已经在第三位或第四位之后四舍五入了。但总的来说,你有没有一个更普遍的解决方案来避免这个问题?@Lavair:没有普遍的解决方案,也不可能。浮点运算是为了逼近实数运算而设计的。这在IEEE-754浮点运算标准中有规定。在大多数情况下,当需要精确的结果时,不应使用浮点运算。使用它来获得准确的结果需要专业知识,并且取决于具体情况。你必须在问题中具体解释你在做什么,以及为什么你需要同样的结果。根据具体情况,解决方案可能是使用浮点以外的方法或使用其他算法。