巨大な値の計算の正しい計算結果が知りたいです。

前提

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

実現したいこと

ideoneのPyPy 2.7.13のdecimalで
(2^((2^(1031-1))-1))*(2-(2^-3705346855594118253554271520278013051304639509300498049262642688253220148476920))
を計算してみました。
検算として、mpmathとdecimalのlogでも計算してみましたが、解答は一致しています。

しかしすべてpythonでの計算なので、他のプログラム言語でも検算できないかと思いました。
例えばC++です。
しかしC++は全く分かりません。
GMPなどの任意精度パッケージが必要なのでしょうか?
ideoneのC++上だけでプログラムを完結できないものでしょうか?
どの様なコードになるのか参考までに教えたいただけるとありがたいです。

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

誤差の範囲内で、途中計算結果が異なっています。
また、decimalといえどもオーバーフローするのでpython3.10.9などでは計算できません。

該当のソースコード

https://ideone.com/aCP13Y

Python

1#(2^((2^(w-1))-1))*(2-(2^-t))2#2^256倍精度3#(2^((2^(1031-1))-1))*(2-(2^-3705346855594118253554271520278013051304639509300498049262642688253220148476920))4from decimal import *5getcontext().prec = 10006from decimal import localcontext 7with localcontext() as ctx:8 print(ctx.Emax) # デフォルトの指数上限は999999なので、今回の計算だと足りない9 ctx.Emax = 10**10**5 # 指数上限を増やす10 #指数部11 w = 103112 #仮数部13 t = 370534685559411825355427152027801305130463950930049804926264268825322014847692014 a = ctx.power(2,(w - 1))15 b = ctx.power(2,(a - 1))16 print(b)17 c = t * -118 d = ctx.power(2,c)19 print(d)20 e = (b * 2 - b * d)21 #最大値22 print("最大値")23 print(e)24 #必要に応じて有効桁を調整する25 format_str = "{:.1e}".format(e)26 print(format_str)27 f = e.log10()28 h = ctx.power(2,t)29 i = h.log10()30 #有効桁数31 print("有効桁数")32 print(i.quantize(Decimal('0'), rounding=ROUND_FLOOR))33

Python+mpmath+gmpy2

1#2^256倍精度2#(2^((2^(1031-1))-1))*(2-(2^-3705346855594118253554271520278013051304639509300498049262642688253220148476920))3from mpmath import *4mp.dps = 10005(mpf(2)**((mpf(2)**(mpf(1031)-mpf(1)))-mpf(1)))*(mpf(2)-(mpf(2)**mpf(-3705346855594118253554271520278013051304639509300498049262642688253220148476920)))6

Python

1from decimal import *2getcontext().prec = 100003from decimal import localcontext 4with localcontext() as ctx:5 6 log10_2 = Decimal(2).log10()7 v = (2**(1031-1))*log10_2 8 print( 10**(v-int(v)), "e", int(v) )9

試したこと

C++で、と思いますが、C++は全く分かりません。
参考になるようなソースコードを提示いただけるとありがたいです。

コメントを投稿

0 コメント