cos20°を高精度で計算する

数学ガール/ガロア理論 (数学ガールシリーズ 5)

数学ガール/ガロア理論 (数学ガールシリーズ 5)

昨日から読んでいる。P.164に、

cos が扱える計算機を使えば、

cos20° = 0.93969262078590838405410927732473…

と計算できる。

と書いてある。ふつうこんなに桁数求まるのかにゃあ、と思ってWindows 7の電卓を叩いてみたら上の通りになった。128ビットで計算しているのかにゃ?


ところで、Pythonでは標準モジュールのdecimalを使うと簡単にこれ以上の高精度でcos20°を求めることができます。
まず、精度を設定します。

getcontext().prec = 52

これでDecimalオブジェクトは52桁の精度で計算されることになります。Decimalオブジェクトは、

Decimal(1)

などとして生成します。
あとは、cos20°は

8x^3 - 6x - 1 = 0

の0と1の間の根なので、最も簡単な2分法で求めます。

from decimal import *

N = 50
getcontext().prec = N + 2
eps = 1 / Decimal(10 ** (N + 1))

def bisection(f, first, last):
    mid = (first + last) / 2
    if last - first < eps:
        return mid
    elif f(mid) > 0:
        return bisection(f, first, mid)
    else:
        return bisection(f, mid, last)

f = lambda x: (8 * x * x - 6) * x - 1
format = "%%.%df" % N
print format % bisection(f, Decimal(0), Decimal(1))

このような結果が得られました。

0.93969262078590842790504211734514683485031127929688

9.4. decimal - 10進固定及び浮動小数点数の算術演算 - Python 2.7ja1 documentation