2017-02-27 14 views
0

私は非常にPythonに新しく、いくつかのアルゴリズムを実装する必要があります。大きな数字(> 1024ビット)のパフォーマンスを向上させるために、gmpy2/mpzを使いたいですが、普通のPython整数もサポートしたいと思います。Python - どのように関数のオーバーロードなしでintとgmpy/mpzの両方を処理するには?

Pythonに関数のオーバーロードが不足しているため、これがどのようにして最良に達成されるのかと思います。

if(a.__class__.__name__ == 'mpz'): 
    a = gmpy2.floor(x/8) 
else: 
    a = floor(x/8) 

この二重性を避けるより良い方法はありますか?

+0

'gmpy2.floor'が両方のケースを処理することを確かめてください。あなたはそれを試しましたか? –

答えて

1

例では、x/8が最初に解釈され、標準のPython float型になります。これは、float型の精度が53ビットしかないため、大きな数値の精度が低下する原因になります。

整数で作業する場合は、床分割演算子//を使用する必要があります。浮動小数点への変換は必要ありません。このアプローチは、Python整数とmpz型で自動的に動作します。

>>> 123456789//256 
482253 
>>> gmpy2.mpz(123456789)//256 
mpz(482253) 
>>> 123456789//gmpy2.mpz(256) 
mpz(482253) 
>>> gmpy2.mpz(123456789)//gmpy2.mpz(256) 
mpz(482253) 

あなたは大きな整数入力での作業と整数の結果をたい場合、私は浮動小数点演算を避けるために、整数で完全に動作します...コメントに

を疑問に答えるために。以下のスニペットは、Python整数型とmpz型の両方で動作し、Python float型の精度には制限されません。

q,r = divmod(123456789,256) 
q += bool(r) 

qは、所望の結果を有する。

+0

ああ、ありがとう!床が単なる一例であったので、 'gmpy2.ceil()'をどうすればいいのでしょうか?なぜなら、私が知る限り、天井に相当するものはないからです。 – user66875

関連する問題