2017-06-06 8 views
0

Pythonは整数に制限はありませんが、浮動小数点にはいくつかの制限があります。 非常に大きなフロートの床を計算するにはどうすればよいですか?Pythonの非常に大きなフロートのフロア

私は床(A * B)を計算しようとしています。ここで、Aは小さな非合理的な数で、おそらくsqrt(2)、e、sqrt(5)などで、Bは10^1000の非常に大きな数です。

答えて

1

あなたはdecimalモジュールを使用することができます。

>>> from decimal import Decimal 
>>> from math import floor, sqrt 
>>> 
>>> d1 = Decimal(sqrt(2)) 
>>> d2 = Decimal(10**1000) 
>>> 
>>> result = d1 * d2 
>>> floor(result) 
あなたはまた、より正確な結果を得るために getcontext().precを使用して、10進数のための精度を設定することができ

>>> from decimal import * 
>>> getcontext().prec = 100 
>>> d1 = Decimal(2).sqrt() 
>>> d1 
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573') 
+0

挑戦は '床(*のB)'の正確な値を計算することである場合は、その後、むしろ '進()' –

+2

よりも ''進(STR())行っているのはなぜ'sqrt(2)'のステップで精度が失われ、後で復元されないため、この答えはそれを解決しません。 – Leon

+0

あなたのコメント、更新されたコードについては、@ Leonと@ Andrew Gelnarに感謝します。 – JkShaw

0

64ビット浮動小数点は〜10^308を超えません。ですから、あなたの10^1000はどんな定数による乗算にもかかわらず、まったく適合しません。 (64ビットの浮動小数点は、10^1000を10^308未満にするのに十分なほど小さいことはありません)。したがって、手続きは浮動小数点のためには機能しません。

decimalモジュールの使用を検討してください。例:

import decimal 
import math 
a = decimal.Decimal("10") ** 10000 
b = decimal.Decimal("0.123") 
math.floor(a*b) 
関連する問題