1

私はPythonでgmpy2を使って算術演算を行おうとしています。残念ながら、この演算の戻り値のタイプはわかりません。例えば:

x=float(gmpy2.comb(100,50))/gmpy2.comb(200,100)
print x
print isinstance(x, (int, long, float, complex))

私に与える:

1.114224180581451e-30
False

少しグーグルで検索したところ、役立つ情報が見つかりませんでした。一般的にPythonでオブジェクトタイプを取得する方法はありますか?それ以外の場合、この値の正確なタイプは何ですか?mpzですか?そして最後の質問は、mpz値(たとえばfloat)を使用して算術演算を行う場合、常に型をmpzにキャストしますか?

PS mpzがここで使用している正しい用語かどうかはわかりません!また、評判の高い人がstackoverflowのタグにgmpyを追加して、gmpyを知っている人が質問にアクセスしやすくすることもできれば幸いです。

4

2 に答える 2

1

gmpy2 では、mpz、mpq、mpfr、および mpc といういくつかの新しいデータ型が導入されています。これらは、Python の int/long、fractions.Fraction、float、および complex 型に類似しています。したがって、mpz を含む除算は、通常、mpfr になります。

あなたの例では、mpz を作成し、それを float に変換してから、mpz で割ります。除算を実行するとき、gmpy2 は float を mpfr に変換してから除算を実行します。float の結果が必要な場合は、gmpy2.comb(100,50) だけでなく、結果全体に float() を適用する必要があります。括弧内の違いに注意してください。

>>> float(gmpy2.comb(100,50))/gmpy2.comb(200,100)
mpfr('1.114224180581451e-30')
>>> float(gmpy2.comb(100,50)/gmpy2.comb(200,100))
1.114224180581451e-30

float から mpfr への変換の理由 mpfr データ型は、はるかに高い精度をサポートでき、float よりもはるかに広い範囲を持ちます。mpfr の精度が float の精度 (つまり 53) 以上である限り、変換は無損失です。

免責事項: 私は gmpy と gmpy2 を保守しています。

于 2013-03-07T13:34:36.343 に答える
1

私は知りませんがgmpy2、Python でオブジェクトの型を見つけるにはx.__class__.

新しいスタイルのクラスでは、type(x).

于 2013-03-07T12:04:38.837 に答える