結局、float()
キャストが解決策だったようです。
まず第一に、逆三角関数はドメイン外の値を取らないため、完全に安全であり、例外をキャッチできます。
>>> acos(5e100)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
関数でも同じことが起こりfmod()
ます。
「通常の」三角関数は、実際に大きな値でない限り、大きな値に問題がないようです。これにより、関数がValueError
再び戻ります。
丸め関数 ( ceil()
、floor()
および) は正常に機能し、値が大きすぎる場合にround()
戻ります。、、、、、、および関数inf
についても同様です。degrees()
log()
log10()
pow()
sqrt()
fabs()
hypot()
radians()
双曲線三角関数とexp()
関数は、 をスローしOverflowError
たり、 を返したりしinf
ます。
このatan2()
関数は、大きな値でも問題なく機能します。
単純な算術演算の場合、float キャストにより、関数は計算を行う代わりにOverflowError
(または) をスローします。inf
>>> float(10) ** float(100) ** float(100) ** float(1000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Numerical result out of range')
>>> float(5e500) * float(4e1000)
inf
最後に、問題のある factorial() 関数です。私がしなければならなかったのは、反復的な方法で関数を再定義し、それを に追加することだけでしたsafe_dict
。
import sys
def factorial(n):
fact = 1
while (n > 0):
fact = float(fact) * float(n)
n -= float(1)
if float(fact) > sys.float_info.max:
return "Too big"
return str(fact)
print factorial(50e500)
これは階乗を計算するための非常に醜く、非常に非効率的な方法ですが、私のニーズには十分です。float()
実際、私は多くの不要なsを追加したと思います。
ここで、式のすべての用語を s で囲み、これが自動的に行われるようにする方法を理解する必要がありfloat()
ます。