3

I have the following python code:

In [1]: import decimal

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

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

Shouldn't it match 0.99003992007996799440405766290496103465557098388671875 according to this 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. Mathematica プログラミング言語からコードを入力しているとWolframAlphaが認識しないようにして、WolframAlphaが独自の魔法を実行できるようにすることができます。njzk2 が述べたように、(1 - 0.002)^5を入力するとこれが行われます。
  2. WolframAlpha に評価を依頼する Mathematica コードでは、機械精度リテラル 0.002 の代わりに無限精度リテラルを入力できます。いくつかの方法がありますが、ここにSetPrecision[(1 - 2*^-3)^5, 80] の1 つがあります。

最後に、Mathematica では、そして Mathematica コードで構成される WolframAlpha クエリの拡張により、通常はSetPrecisionではなくN ( documentation )が必要になることを指摘したいと思います。これらはよく似ていますが (この場合は同一)、微妙な違いがあります。

  • SetPrecision[..., n] 最初にすべての囲まれた数値を精度 n に設定し、次にすべてを評価します (丸め誤差が発生します)
  • N[..., n] は基本的に、最終的な丸め誤差がほぼ確実に n 未満になるまで、より高い精度で SetPrecision を繰り返し試行します。

N は少し難しくなりますが、適切な桁数が得られます (入力が十分に正確であると仮定します)。

WolframAlpha を使用して Mathematica コードを介してこの計算を行うための私の最後の提案はN[(1 - 2*^-3)^5, 80]です。

于 2013-11-09T06:45:59.090 に答える
2

wolfram は間違っています。1 乗してみると、0.9979999999999999982236431605997495353221893310546875代わりにが得られます0.998。浮動小数点数を使用している可能性があります。

于 2013-11-08T16:41:11.210 に答える
2

Andrewsの回答に続いて、入力されたリテラルの精度が、SetPrecisionディレクティブが到達する前に機械精度であると見なされた結果です。

これに対する別の修正は、基本的な入力表記を保持するという点で優れていますが、バックティック表記でリテラルの精度を直接指定することです。

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

望ましい結果が得られます。

まだフォローしていない人のために、すべてのゼロを入力することもできます..

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

これらは alpha と mathematica で動作します。

于 2013-11-09T13:49:13.493 に答える