2017-01-15 32 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

で表示桁を増やすことができますが、 'decimal'パッケージを使用してみましたか?あるいは、整数除算をしたいのであれば、 '/'の代わりに '//'を使うとどうなりますか? –

+0

Pythonの浮動小数点は、通常の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は私のケースでははるかに効果的だったので、Fractionを使用して終了しました。 – Adminy

1

は(https://docs.python.org/2/library/decimal.htmldecimalモジュールをインポートすることがabritrary精度

を持っているあなたは

>>> 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/10進数(3.0)。アサートd1 == d2 *小数点(3.0) '。 'd2 * Decimal(3.0)'が 'Decimal( '0.99999999999999999999999999')'に評価されるため、これは 'AssertionError'を発生させます。ここでのポイントは、 'Decimal'は(ほぼ)任意の精度を提供しますが、_infinite_精度は提供しないということです。 –

+0

@a_guest Fractionが正しい間にDecimalは無限に正確ではありませんか?意味分数モジュールを使ってオリジナルを得ることができますか? – Adminy

+0

@Adminyはい 'Fraction'は、分子と分母としての有理数を表し、したがって、すべての有理数を正確に表すことができます(numとdenomが当然メモリに収まる限り)。 'decimal'モジュールでは、_無限の精度を選択することができます(もちろん無限小数点以下を格納することはできません)。 'Fraction(1,3)'は正確な表現で、Decimal(1.0)/ Decimal(3.0)は指定した精度の後に小数点以下を切り捨てます。 –