2017-01-15 6 views
0

매우 큰 정수를 나누므로 최대 1kb 정수를 말하기 때문에 이미 2 가지 문제가있었습니다. 어느Python3 대용량 플로트의 분할 중지

OverflowError: integer division result too large for a float

또는 플로트 일부 자리로 반올림 내가 다시 번식 할 때 나는 약간 다른 번호를합니다.

파이썬에서 어떻게 든 소수점 이하 20 자리 이상의 수레를 나누는 것을 막을 방법이 있습니까?

smallest_floats = [] 

n1 = int(input()) 
n2 = int(input()) 

while n2 != 1: 
    smallest_floats.append(str(n1/n2)) 
    n2 -= 1 
print(min(smallest_floats, key=len)) 

나는 가능한 솔루션은 어떻게 든 분열을 주장하는 것입니다 생각이나하고 :

len(s.split(".")[-1]) > 20 
+1

와 abritrary 정밀

가 표시 높일 수 있습니다 진수있다? 또는 정수 나누기를 원한다면'/'대신'//'를 사용하면 어떻게됩니까? –

+0

파이썬의 플로트는 일반적인 64 비트 배정도 부동 소수점 숫자입니다. 원하는 것을 위해 다중 정밀 패키지를 가져와야합니다. Scipy 나 Sympy는 그런 것을 가질 수 있습니다. – LutzL

+0

플로트 번호가 필요하므로 번호를 재현해야합니다. – Adminy

답변

1

를 유리수 연산을 위해 정밀 손실없이 당신이 fractions package에서 fractions.Fraction 클래스를 사용할 수 있습니다. 당신은 다른 합리적인 수로 나눈 다음 다시 곱하여 처음에 가지고 있던 것과 똑같은 합리적인 수를 얻을 수 있습니다.

>>> from fractions import Fraction 
>>> n1 = Fraction(large_numerator, denominator) 
>>> n2 = n1/some_rational_number 
>>> assert n1 == n2 * some_rational_number 
+0

U는 제 경우에 비해 훨씬 효과적 이었으므로 분수를 사용하여 끝났습니다. 솔루션의 95 % 분수. – Adminy

1

가져옵니다 decimal 모듈 (https://docs.python.org/2/library/decimal.html) 당신은`decimal` 패키지를 사용하여 시도 적이

>>> from decimal import * 
>>> getcontext().prec = 100 
>>> Decimal(2).sqrt() 
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573') 100 decimal digits 

how can i show an irrational number to 100 decimal places in python?

+1

원래의 정수를 정확히 재현해야하는 경우에는 가장 좋은 도구는 아닙니다 (대부분의 경우에 잘 작동 할 수도 있음). 다음을 시도해보십시오 :'d1 = Decimal (1.0); d2 = d1/십진수 (3.0); assert d1 == d2 * Decimal (3.0)'. 'd2 * Decimal (3.0)'이'Decimal ('0.99999999999999999999999999')'로 평가되기 때문에 이것은 AssertionError를 발생시킵니다. 여기서 중요한 점은'Decimal'은 (거의) 임의의 정밀도를 제공하지만 _infinite_ precision은 제공하지 않는다는 것입니다. –

+0

@a_guest 분수가 맞으면 십진법은 무한정 정확하지 않습니까? 의미 분수 모듈을 사용하여 원본을 다시 얻을 수 있습니까? – Adminy

+0

@Adminy Yes'Fraction'은 분자와 분모의 합리적인 수를 나타내므로 모든 유리수를 정확하게 나타낼 수 있습니다 (num과 denom이 물론 메모리에 들어갈 수있는 한). 'decimal' 모듈을 사용하면 _arbitrary_ 정밀도를 선택할 수 있습니다. 물론 이것은 _infinite_가 될 수 없습니다 (예를 들어 무한 수의 소수점을 저장할 수 없습니다). 'Fraction (1, 3)'은 정확한 표현이고, Decimal (1.0)/Decimal (3.0)은 여러분이 지정한 정밀도 뒤에 소수점 이하자를자를 것입니다. –