우선, 역 삼각 함수는 도메인 외부에서 값을 가져 가지 않으므로 완전히 안전하고 예외가 잡힐 수 있습니다.
를, 아니라면 "정상"삼각 함수가 큰 값으로 어떤 문제가하지 않는 것. 반올림 함수 (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.
이제 표현식의 모든 단어 주위에 float()
을 붙이는 방법을 알아야합니다. 자동으로 발생합니다.
나는 eval을 사용한다는 것을 알고 있지만, 나는 오랫동안 위험한 명령을 실행하려고 시도해 왔으며 아무 것도 할 수 없었다. 나는 이것이 100 % 안전하다는 것을 보장하지는 않지만 사용하게 될 사용자가 "준 신뢰"하다는 의미인데, 이는 그들이 os로 이상한 일을하지 않을 것이라는 것을 의미하지만 나는 그들이 단지 죽일 것이라고 확신한다. 재미있는 로봇. – user1002327
다음은 계산기의 실제 코드입니다. 질문을 간단하게하기 위해 사용한 것입니다. http://pastebin.com/auF1krdh – user1002327
파이썬에 대해 전혀 알지 못하는데, Loic과 같은 접근법이 필요하다고 생각합니다. 계산기를 독립적 인 프로세스로 시작하고 지정된 시간 후에 종료하십시오. 팩토리얼 같은 기능을 사용하는 것이 두려운 것은 사용자가 빠른 계산 가능한 입력 만 삽입하도록하는 것은 거의 불가능하며 발에서 계산기를 쏠 수있는 방법이 너무 많습니다. –