マチンの公式を使用して円周率の値を計算すると、間違った値が得られるのはなぜですか?

Akhilesh Sharma

私の学校のプロジェクトでは、さまざまな方法を使用することの価値を計算しようとしていました。私が見つけた式の1つは、arctan(x)のテイラー展開を使用して計算できるマチン式でした。

私はPythonで次のコードを書きました:

import decimal

count = pi = a = b = c = d = val1 = val2 = decimal.Decimal(0) #Initializing the variables      
decimal.getcontext().prec = 25 #Setting percision

while (decimal.Decimal(count) <= decimal.Decimal(100)): 
    a = pow(decimal.Decimal(-1), decimal.Decimal(count))
    b = ((decimal.Decimal(2) * decimal.Decimal(count)) + decimal.Decimal(1))
    c = pow(decimal.Decimal(1/5), decimal.Decimal(b))
    d = (decimal.Decimal(a) / decimal.Decimal(b)) * decimal.Decimal(c)
    val1 = decimal.Decimal(val1) + decimal.Decimal(d)
    count = decimal.Decimal(count) + decimal.Decimal(1)
    #The series has been divided into multiple small parts to reduce confusion

count = a = b = c = d = decimal.Decimal(0) #Resetting the variables

while (decimal.Decimal(count) <= decimal.Decimal(10)):
    a = pow(decimal.Decimal(-1), decimal.Decimal(count))
    b = ((decimal.Decimal(2) * decimal.Decimal(count)) + decimal.Decimal(1))
    c = pow(decimal.Decimal(1/239), decimal.Decimal(b))
    d = (decimal.Decimal(a) / decimal.Decimal(b)) * decimal.Decimal(c)
    val2 = decimal.Decimal(val2) + decimal.Decimal(d)
    count = decimal.Decimal(count) + decimal.Decimal(1)
    #The series has been divided into multiple small parts to reduce confusion

pi = (decimal.Decimal(16) * decimal.Decimal(val1)) - (decimal.Decimal(4) * decimal.Decimal(val2))
print(pi)

問題は、ループが繰り返される回数に関係なく、小数点以下15桁までしかpiの正しい値を取得できないことです。

例えば:

最初のループの11回の繰り返しで

pi = 3.141592653589793408632493

最初のループの100回の繰り返しで

pi = 3.141592653589793410703296

arctan(1/239)は非常に小さく、数回の繰り返しで非常に小さい値に達するため、2番目のループの繰り返しを増やしていません。したがって、小数点以下15桁のpiの値に影響を与えることはありません。

追加情報:

マチンの公式は次のように述べています。

   π = (16 * Summation of (((-1)^n) / 2n+1) * ((1/5)^(2n+1))) - (4 * Summation of (((-1)^n) / 2n+1) * ((1/239)^(2n+1)))    
PM2リング

その数の用語は、小数点以下50桁を超えるのに十分です。問題は、PythonのfloatとDecimalsを混在させているため、計算がこれらのfloatのエラーで汚染されていることです。エラーは53ビット(10進数で約15桁)までしか正確ではありません。

変更することで修正できます

c = pow(decimal.Decimal(1/5), decimal.Decimal(b))

c = pow(1 / decimal.Decimal(5), decimal.Decimal(b))

または

c = pow(decimal.Decimal(5), decimal.Decimal(-b))

明らかに、同様の変更を行う必要があります

c = pow(decimal.Decimal(1/239), decimal.Decimal(b))

あなたはあなたのコードを作ることが多く、読みやすいです。手始めに、arctan(1/5)とarctan(1/239)に複製するのではなく、arctanシリーズを計算するものを関数に入れる必要があります。

また、すべてにDecimalを使用する必要はありませんcountやなどの単純なPython整数を使用できaます。たとえば、の計算aは次のように書くことができます

a = (-1) ** count

またはa、ループの外側で1に設定し、ループを通過するたびにそれを無効にすることもできます。

これがあなたのコードのよりコンパクトなバージョンです。

import decimal

decimal.getcontext().prec = 60 #Setting precision

def arccot(n, terms):
    base = 1 / decimal.Decimal(n)
    result = 0
    sign = 1
    for b in range(1, 2*terms, 2):
        result += sign * (base ** b) / b
        sign = -sign
    return result

pi = 16 * arccot(5, 50) - 4 * arccot(239, 11)
print(pi)

出力

3.14159265358979323846264338327950288419716939937510582094048

最後の4桁はごみですが、残りは問題ありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

疑似乱数を使用して円周率の値を推定すると、2.44前後の値が得られます。私は何が間違っているのですか?

分類Dev

PRNGを使用して円周率を推定するときに常に2.8284が得られるのはなぜですか?

分類Dev

「==」と比較して「is」を使用すると、np.allが間違った値を返すのはなぜですか?

分類Dev

各桁の4乗の合計を計算すると、なぜ間違った結果が得られるのですか?

分類Dev

無限ループを使用して符号なし整数を追加すると、間違った結果が得られるのはなぜですか?

分類Dev

Cでn> = 34の場合、配列を使用して階乗値を格納すると間違った値が出力されるのはなぜですか

分類Dev

cudaに2つの数値を追加すると間違った結果が得られるのはなぜですか?

分類Dev

変数を使用した計算では、セル参照を使用した計算とは異なる結果が得られるのはなぜですか?

分類Dev

ダート-いくつかのdouble値を減算すると、間違った結果が得られます

分類Dev

cの整数配列(例:int a []):a [i]を使用してアクセスすると、間違った値が返されるのはなぜですか。

分類Dev

このコードが間違った計算をしているのはなぜですか?

分類Dev

PHPでnumber_formatを使用して値をフォーマットしているときに間違った結果が得られる計算

分類Dev

なぜ間違った出力が得られるのですか?

分類Dev

単純な計算の値がJavaで間違った結果をもたらすのはなぜですか?オーバーフローしますか?

分類Dev

与えられたシリーズから円周率の値を計算する際の不正解

分類Dev

サブレポートの戻り値を使用すると、グループから間違った合計を取得するのはなぜですか?

分類Dev

フィボナッチ-なぜこれが間違った計算をするのですか?

分類Dev

(。)演算子を使用して構造体メンバーの値を出力すると、->演算子とは異なる結果が得られます。なぜですか?

分類Dev

最大配列値と最小配列値を計算すると、間違った結果が得られます

分類Dev

単純な整数の乗算でdoubleが期待どおりに機能するのに、int64_tを使用すると間違った結果が得られるのはなぜですか

分類Dev

Cの罪計算コードが間違った値を返すのはなぜですか?

分類Dev

値の割り当てが黙って失敗したり、間違ったことをしたりするのはなぜですか。

分類Dev

どこで間違っているのか、得られた価値を見つけるのですか?

分類Dev

EF Core 2.0が間違った値を生成しているように見えるのはなぜですか?

分類Dev

配列のコンテンツを印刷しているときに、awkを使用して間違った出力が表示されるのはなぜですか

分類Dev

jqueryを使用してボタンの高さを特定すると、間違った結果が得られます

分類Dev

localstorageが間違った値を保存するのはなぜですか?

分類Dev

memsetが間違った値を設定するのはなぜですか?

分類Dev

printfが間違った値を出力するのはなぜですか?

Related 関連記事

  1. 1

    疑似乱数を使用して円周率の値を推定すると、2.44前後の値が得られます。私は何が間違っているのですか?

  2. 2

    PRNGを使用して円周率を推定するときに常に2.8284が得られるのはなぜですか?

  3. 3

    「==」と比較して「is」を使用すると、np.allが間違った値を返すのはなぜですか?

  4. 4

    各桁の4乗の合計を計算すると、なぜ間違った結果が得られるのですか?

  5. 5

    無限ループを使用して符号なし整数を追加すると、間違った結果が得られるのはなぜですか?

  6. 6

    Cでn> = 34の場合、配列を使用して階乗値を格納すると間違った値が出力されるのはなぜですか

  7. 7

    cudaに2つの数値を追加すると間違った結果が得られるのはなぜですか?

  8. 8

    変数を使用した計算では、セル参照を使用した計算とは異なる結果が得られるのはなぜですか?

  9. 9

    ダート-いくつかのdouble値を減算すると、間違った結果が得られます

  10. 10

    cの整数配列(例:int a []):a [i]を使用してアクセスすると、間違った値が返されるのはなぜですか。

  11. 11

    このコードが間違った計算をしているのはなぜですか?

  12. 12

    PHPでnumber_formatを使用して値をフォーマットしているときに間違った結果が得られる計算

  13. 13

    なぜ間違った出力が得られるのですか?

  14. 14

    単純な計算の値がJavaで間違った結果をもたらすのはなぜですか?オーバーフローしますか?

  15. 15

    与えられたシリーズから円周率の値を計算する際の不正解

  16. 16

    サブレポートの戻り値を使用すると、グループから間違った合計を取得するのはなぜですか?

  17. 17

    フィボナッチ-なぜこれが間違った計算をするのですか?

  18. 18

    (。)演算子を使用して構造体メンバーの値を出力すると、->演算子とは異なる結果が得られます。なぜですか?

  19. 19

    最大配列値と最小配列値を計算すると、間違った結果が得られます

  20. 20

    単純な整数の乗算でdoubleが期待どおりに機能するのに、int64_tを使用すると間違った結果が得られるのはなぜですか

  21. 21

    Cの罪計算コードが間違った値を返すのはなぜですか?

  22. 22

    値の割り当てが黙って失敗したり、間違ったことをしたりするのはなぜですか。

  23. 23

    どこで間違っているのか、得られた価値を見つけるのですか?

  24. 24

    EF Core 2.0が間違った値を生成しているように見えるのはなぜですか?

  25. 25

    配列のコンテンツを印刷しているときに、awkを使用して間違った出力が表示されるのはなぜですか

  26. 26

    jqueryを使用してボタンの高さを特定すると、間違った結果が得られます

  27. 27

    localstorageが間違った値を保存するのはなぜですか?

  28. 28

    memsetが間違った値を設定するのはなぜですか?

  29. 29

    printfが間違った値を出力するのはなぜですか?

ホットタグ

アーカイブ