2016-09-12 2 views
0

좀 암호화 문제를 해결하고있어, 수 없습니다 정확한 큐브 루트

내가 나는 그것이 이상한 생각

x = x ** (1./3) 

사용하여 나에게 3464341716380.1113

을 제공 4.157786362549383e+37의 큐브 루트가 필요 처음에는 시도 했으므로 시도했습니다.

x=1000 
print(x) 
x= pow(x,1/3) 
print(x) 

9.99999998

나는 심지어 어딘가에서 시도했다. else. 그러나 나는 같은 결과를 얻었다. 뭔가 잘못 됐니? 어떻게하면 실제 큐브 루트를 계산할 수 있습니까?

+5

이것은 부동 소수점 문제처럼 보입니다 ... http://stackoverflow.com/q/588004/748858. 상징적 인 조작 (예 :'sympy')으로 작업하기위한 라이브러리가 없으면 아마 더 좋아지지 않을 것입니다. – mgilson

+0

http://stackoverflow.com/questions/14057835/more-decimal-places-needed-in-python을보세요. 진정한 큐브 루트가 아니지만 더 가까울 수 있습니다. –

+0

3464341716380.1113이 왜 잘못 생각하나요? – interjay

답변

1

부동 소수점 계산으로 인해 표현하기가 어렵습니다.

decimal을 사용하면 다소 문제는 해결되지만 특정 숫자에서는 여전히 문제가 있으며 적분 만 반올림 할 수 있습니다. 다음과 같이 소수점을 사용해보십시오.

>>> (1000 ** (Decimal(1)/3)).to_integral_exact() 
Decimal('10') 
+0

이 값은 1000에서는 작동하지만 큰 값에서는 작동하지 않습니다. 심지어 모든 af가 Decimal 일지라도. –

0

컴퓨터에서 부동 소수점 숫자를 처리 할 때 일반적입니다. 소수점 이하 자릿수는 2 진수로 정확하게 표현할 수 없으므로 2의 음수를 처리하므로 매우 근접한 근사를 얻는 데 익숙해 져야합니다.

이 특정 경우 결과가 정수라고 가정하면 round()을 사용하면됩니다.

0

두 답변은 하드웨어의 수치 표현의 정확도 내에서 정확합니다. 1/3은 2 진수에서 반복되는 "10 진수"입니다. 0.010101010101 ... 정확하게 표현할 수 없습니다.

"진짜"큐브 루트를 원한다면 유용하다고 생각되는 반올림 문제와 대소 문자를 처리하는 알고리즘을 구현해야합니다. 표현 문제가 주어지면 정수형 큐브를 확실히 커버 할 수 있습니다. 그러나 cube_root (1.728) => 1.2와 같은 단순한 경우조차도 문제가 될 수 있습니다. 십진수는 정확하게 바이너리로 변환되지 않습니다.

0

다른 답변에서 설명한 것처럼 부동 소수점 숫자의 정밀도가 제한되어 있기 때문입니다. 수학이 상징적으로 수행되지 않는 한, 정확하게 값을 표현하는 것은 불가능합니다. 제한된 정밀도로도 괜찮지 만 내장 된 데이터 유형보다 정밀도가 더 필요하다면 임의의 정밀도 산술 라이브러리 (예 : this one)를 제안합니다.

관련 문제