0

我正在使用 python 并使用乘法和除法,但我无法通过此操作获得我想要的准确性。下面的例子可能有助于达到我的观点。

a = 3b = 4,他们的欧几里得范数 (sqrt(a*a + b*b))是 5.0,除法工作正常,比如3/5.00.6 和4/5.0= 0.8。但是当我想做以下答案时3 * -0.8 + 0.6*4,答案是一个小数字,但不是预期的零。

我知道数据类型、寄存器和一般机器限制固有的问题,但我认为必须有一种方法,至少对于简单的计算(如示例)来说,没有错误。

4

2 回答 2

3

您可以使用Fraction以获得准确的答案:

>>> from fractions import Fraction
>>> Fraction(-8, 10) * 3 + Fraction(6, 10) * 4
Fraction(0, 1)

或使用Decimal

>>> from decimal import Decimal
>>> Decimal('-0.8') * 3 + Decimal('0.6') * 4
Decimal('0.0')

注意String小数中的使用:使用普通数字会使小数使用不准确的数字值。

于 2013-05-21T04:34:24.560 回答
1

这应该会给 Python 一些具体的见解:http: //docs.python.org/2/tutorial/floatingpoint.html

但是,在您的处理器执行的浮点计算中情况是相同的。由于浮点数的存储方式,不可能准确地表示所有数字的整个连续体。当您执行运算时,数字末尾的一些额外“近似值”数据通常不会在输出中看到(它被剪掉),它们会潜入您的计算中。请注意,3.*-8./10.+0.6*4 给出了更接近您期望的近似值,可能是因为 3.*8 和 10 的近似值比 0.8 更接近实际值,所以您结束累积误差更小。

Python 有一个可以使用的十进制库,它使用不同的底层表示,但除非你只做一些操作,否则它会变慢。如果获得“精确”数字更重要,则使用这些库之一,否则浮点近似值通常就足够了。您可以在此处找到更多信息:http: //docs.python.org/2/tutorial/floatingpoint.html

于 2013-05-21T04:46:59.157 回答