(2^((2^(263-1))-1))*(2-(2^-590295810358705651448))の計算結果が知りたいです。

前提

巨大な値の計算をPythonで行ってみました。

実現したいこと

ideoneのPyPy 2.7.13のdecimalで
(2^((2^(263-1))-1))*(2-(2^-590295810358705651448))
を計算してみましたが、途中で誤差が出て正しい値が出力されているのか分かりません。
正しい値を知りたいです。先頭100桁とE+ほにゃららで構いません。
ちなみに桁数が10^79ありますので、Python3.10.6やGoogleColabではdecimalでは桁数の桁数が18桁までなので計算できません。
ideoneのPyPy 2では桁数が10^10^5程度までは扱えるようです。(が、一部で誤差が出る。そのためにPython3では桁数制限がかかっていると思われる。)
よろしくお願いいたします。

発生している問題・エラーメッセージ

途中の計算結果:

0E-1000000098

該当のソースコード

https://ideone.com/f1FRWv

Python

#(2^((2^(w-1))-1))*(2-(2^-t))#2^64倍精度#(2^((2^(263-1))-1))*(2-(2^-590295810358705651448))from decimal import *getcontext().prec = 100from decimal import localcontext with localcontext() as ctx: print(ctx.Emax) # デフォルトの指数上限は999999なので、今回の計算だと足りない ctx.Emax = 10**10**5 # 指数上限を増やす #指数部 w = 263 #仮数部 t = 590295810358705651448 a = ctx.power(2,(w - 1)) b = ctx.power(2,(a - 1)) print(b) c = t * -1 d = ctx.power(2,c) print(d) e = (b * 2 - b * d) #最大値 print("最大値") print(e) #必要に応じて有効桁を調整する format_str = "{:.1e}".format(e) print(format_str) f = e.log10() #桁数-1 print("桁数-1") print(f.quantize(Decimal('0'), rounding=ROUND_FLOOR)) #桁数 print("桁数") print(f.quantize(Decimal('0'), rounding=ROUND_CEILING)) g = f.log10() #桁数の桁数-1 print("桁数の桁数-1") print(g.quantize(Decimal('0'), rounding=ROUND_FLOOR)) #ウルフラムアルファ確認用 print("ウルフラムアルファ確認用") print(g) h = ctx.power(2,t) i = h.log10() #有効桁数 print("有効桁数") print(i.quantize(Decimal('0'), rounding=ROUND_FLOOR))

試したこと

Python3.10.6(VSCode)やGoogleColabではdecimalでは桁数の桁数が18桁までなので計算できません。

コメントを投稿

0 コメント