3

我有以下python代码:

In [1]: import decimal

In [2]: decimal.getcontext().prec = 80

In [3]: (1-decimal.Decimal('0.002'))**5
Out[3]: Decimal('0.990039920079968')

它不应该0.99003992007996799440405766290496103465557098388671875 根据这个http://www.wolframalpha.com/input/?i=SetPrecision%5B%281+-+0.002%29%5E5%2C+80%5D匹配吗?

4

4 回答 4

4

这是这里发生的事情:因为它看起来像来自 Mathematica 编程语言的语法,所以 WolframAlpha 将输入解释SetPrecision[(1 - 0.002)^5, 80]为 Mathematica 源代码,并继续对其进行评估。在 Mathematica 中,正如其他人在其他答案中所推测的那样,0.002 是机器精度浮点文字值。出现舍入误差。最后,生成的机器精度值由 SetPrecision 转换为最接近的 80 精度值。

为了解决这个问题,您有几个选择。

  1. 您可以尝试让 WolframAlpha 不认为您正在输入来自 Mathematica 编程语言的代码,这样它就会发挥自己的魔力。正如 njzk2 提到的,输入(1 - 0.002)^5将执行此操作。
  2. 在您要求 WolframAlpha 计算的 Mathematica 代码中,您可以输入一个无限精度的文字而不是机器精度文字 0.002。有几种方法,但这里有一种:SetPrecision[(1 - 2*^-3)^5, 80]

最后,我想指出,在 Mathematica 中,以及在由 Mathematica 代码组成的 WolframAlpha 查询的扩展中,您通常需要 N(文档)而不是SetPrecision。它们通常相似(在这种情况下相同),但存在细微差别:

  • SetPrecision[..., n] 首先将所有包含的数字设置为精度 n,然后评估所有内容(将出现舍入误差)
  • N[..., n] 基本上以越来越高的精度反复尝试 SetPrecision,直到最终的舍入误差几乎肯定小于 n。

N 工作稍微困难一些,但可以为您提供正确数量的正确数字(假设输入足够精确)。

因此,我对使用 WolframAlpha 通过 Mathematica Code 进行此计算的最终建议是N[(1 - 2*^-3)^5, 80]

于 2013-11-09T06:45:59.090 回答
3

Wolfram alpha 在这里实际上是错误的。

(1 - 0.002) ** 5

正是0.990039920079968

您可以通过简单地评估 15 后的数字来验证这一点.,这与表达式中的5 * 33 后的位数相匹配。根据定义,第 15 位之后不能有任何数字。.(1 - 0.002)

编辑

多一点挖掘让我得到了一些有趣的东西:

此符号Decimal('0.002')创建具有此精确值的实际小数。使用Decimal(0.002)小数是由浮点数而不是字符串制成的,这会造成不精确。使用这个符号是原始公式:

(1-decimal.Decimal(0.002))**5

返回Decimal('0.99003992007996799979349352807411754897106595345737537649055432859002826694496107'在 之后确实长 80 位.,但与 wolfram alpha 值不同。

这可能是由 python 和 wolfram alpha 浮点表示之间的精度差异引起的,并且进一步表明 wolfram alpha 在使用 SetPrecision 时正在使用浮点数。

注意:直接询问结果会返回正确的值(参见http://www.wolframalpha.com/input/?i=%281+-+0.002%29%5E5)。

于 2013-11-08T16:40:30.207 回答
2

按照 Andrews 的回答,这是因为在 SetPrecision 指令到达之前,输入文字的精度被视为机器精度。

对此的另一个解决方法是,它保留了您的基本输入符号,这是很好的,它是使用反引号直接指定文字的精度:

SetPrecision[(1-.002`80)^5, 80]

产生所需的结果。

对于仍然不关注的任何人,您也可以键入所有零。

 SetPrecision[(1-.0020000000000000000000000...0000)^5, 80]

这些在 alpha 和数学中工作。

于 2013-11-09T13:49:13.493 回答
2

wolfram 错了,试试它的 1 次方,你得到0.9979999999999999982236431605997495353221893310546875的不是0.998. 他们很可能使用浮点数。

于 2013-11-08T16:41:11.210 回答