前提
巨大な値の計算を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 コメント