2017-02-01 9 views
1

__float128と同等のPythonでの作業方法は? decimal.getcontext()にはどの程度の精度を使用する必要がありますか?つまり、小数点以下の桁数で指定された精度ですか? float128に相当する

from decimal import * 
getcontext().prec = # 34 or 128 ? 

はそれが getcontext().precで「グローバル」に設定するのではなく、特定の操作のために、「ローカル」の精度を設定することは可能ですか?

Simon Byrne氏のコメントでは、DecimalとIEEE754で定義された__float128をシミュレートすることも可能ですか?四倍精度が必要な場合、Pythonで他にどのようなオプションがありますか?

+1

あなたの回答は[ドキュメント](https://docs.python.org/3/library/decimal.html)にあります。 – vaultah

+0

@vaultah私は事前に文書を調べました。はい、正しく理解したかったと思います。 '.prec'が本当に** decimal **の場所を設定しているかどうかを調べたいと思っていました。例えば、... –

+0

' decimal'は10進浮動小数点の実装なので、 '.prec'は小数点以下の桁数です。これはバイナリ形式の '__float128'以外の答えをあなたに与えます。 –

答えて

2

私はgmpy2のメンテナーです。 gmpy2は、MPFRをラップすることに加えて、GMP(整数および有理数の場合)およびMPC(複雑な算術の場合)もラップします。 MPFRとMPCの両方は、小数表現を使用するDecimalと比較してバイナリ表現を使用します。

ここには、float128に相当する使用例が簡単に示されています。 2.0.xのシリーズについて

>>> import gmpy2 
>>> gmpy2.set_context(gmpy2.ieee(128)) 
>>> gmpy2.get_context() 
context(precision=113, real_prec=Default, imag_prec=Default, 
     round=RoundToNearest, real_round=Default, imag_round=Default, 
     emax=16384, emin=-16493, 
     subnormalize=True, 
     trap_underflow=False, underflow=False, 
     trap_overflow=False, overflow=False, 
     trap_inexact=False, inexact=False, 
     trap_invalid=False, invalid=False, 
     trap_erange=False, erange=False, 
     trap_divzero=False, divzero=False, 
     trap_expbound=False, 
     allow_complex=False) 
>>> gmpy2.sin(gmpy2.mpfr("1.2")) 
mpfr('0.932039085967226349670134435494826026',113) 

gmpy2.ieee()は、32、64、または128ビットのフォーマットをサポートするためのコンテキストを作成します。開発ブランチのサポートは、より広い範囲の精度です。

+0

Btw。、あなたはちょうどどれほど遅いIEEE soft float128がハードウェアの倍精度と比較されるか知っていますか? –

+0

@エシリア私は10倍遅くすることから始めますが、それは操作に依存します。私は後でいくつかのベンチマークを実行することができます。 – casevh

1

残念ながら、Pythonは、浮動小数点型が1つだけのネイティブサポートを提供しています。これは、基礎となるアーキテクチャのdouble型です。

アーキテクチャによっては、numpyはfloat128を宣言できますが、一貫して使用できないことがわかっています。

numpyの外で(またはnumpyがそれをサポートしていないプラットフォームで)必要な場合は、GNU MPFR libraryのラッパーであるbigfloat package on pypiを見ることができます。しかし、現在ベータ版で宣言されており、ソースからビルドする準備ができている必要があります。 @ MarkDickinsonさんのコメントの後


(彼はビッグフロートの著者である)、gmpy2はは、PyPIに安定したと宣言し、より豊かな、より良い維持の両方ですMPFRの周りに別のラッパーです。

+0

「bigfloat」の作者として、人々は代わりに 'gmpy2'を見てみることをお勧めします。 :-)それはより良く維持され、MPFR(とそれ以上)をラップするのと同じ仕事をします。 –

+0

ところで、NumPyの 'float128'が本当にIEEE 754 binary128タイプ(double-doubleやfloat80タイプのゼロとは対照的)であるプラットフォームは知っていますか? –

+0

@ MarkDickinson:あなたのコメントありがとう!私は私のポストにそれを含めました。残念ながら、私は偉大なnumpyのユーザーではありません... –