看起來好像是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()
功能工作完美罰款與大值。
對於簡單的算術運算,浮點投球使函數拋出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。
現在我需要弄清楚如何將float()
s放在表達式中的所有術語中,所以這會自動發生。
我知道它使用'eval',但我試圖長時間執行危險的命令,我什麼也做不了。我知道這並不能保證它是100%安全的,但是將要使用的用戶是「半可信」的,這意味着他們不會用'os'做出奇怪的事情,但我相信他們會殺死有趣的機器人。 – user1002327 2012-07-14 20:01:17
下面是計算器的實際代碼,我使用那個僅用於提出問題的簡短代碼。 http://pastebin.com/auF1krdh – user1002327 2012-07-14 20:02:15
不知道python我想你需要像Loic之一的方法:啓動計算器作爲獨立的進程,並在指定的時間後殺死它。我擔心通過使用factorial等函數幾乎不可能強制用戶只插入快速可計算的輸入,但在腳中拍攝計算器的方法太多了。 – 2012-07-14 20:13:10