Pythonは整数に制限はありませんが、浮動小数点にはいくつかの制限があります。 非常に大きなフロートの床を計算するにはどうすればよいですか?Pythonの非常に大きなフロートのフロア
私は床(A * B)を計算しようとしています。ここで、Aは小さな非合理的な数で、おそらくsqrt(2)、e、sqrt(5)などで、Bは10^1000の非常に大きな数です。
Pythonは整数に制限はありませんが、浮動小数点にはいくつかの制限があります。 非常に大きなフロートの床を計算するにはどうすればよいですか?Pythonの非常に大きなフロートのフロア
私は床(A * B)を計算しようとしています。ここで、Aは小さな非合理的な数で、おそらくsqrt(2)、e、sqrt(5)などで、Bは10^1000の非常に大きな数です。
あなたは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')
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)
挑戦は '床(*のB)'の正確な値を計算することである場合は、その後、むしろ '進()' –
よりも ''進(STR())行っているのはなぜ'sqrt(2)'のステップで精度が失われ、後で復元されないため、この答えはそれを解決しません。 –
Leon
あなたのコメント、更新されたコードについては、@ Leonと@ Andrew Gelnarに感謝します。 – JkShaw