2016-02-24 15 views
15

これは、ほとんどが好奇心の質問です。 numpyのテストスイートcontains tests for 128 bit integersnumerictypes moduleは、int128,(octuple precision?)、および私のマシン上でnumpyのdtypesにマップされていないようなタイプのものがあることに気付きました。ナンシー8倍精度浮動小数点数と128ビット整数。なぜ、どのように?

私のマシンは64ビットですが、私は4倍の128ビット浮動小数点(but not really)を使用できます。ソフトウェアで4倍の浮動小数点数をエミュレートすることができれば、理論的には8倍浮動小数点数と128ビット整数をエミュレートすることができると私は考えています。一方、今までは、128ビット整数または8倍精度浮動小数点のいずれも以前は聞いたことがありませんでした。対応するdtypeがない場合、numpyのnumerictypesモジュールに128ビット整数と256ビット浮動小数点への参照があり、どうすれば使用できますか?

+0

私はあなたがどんな '32 * N 'または理論的には、' 64 * N'精度をうまくできると思いますが、私はそれらのタイプについてのみ実施されていることを言わなければなりませんテストでは興味深いです。 –

+3

'np.float128'は通常128ビットの精度を持たないことに注意してください。これはCの' long double'に相当します。通常、x86では80ビットです([こちらをご覧ください](http:// stackoverflow。 com/q/9062562/1461210))。 –

+0

@ali_m参照してください。私は今日何か新しいことを学びました! – gerrit

答えて

3

これは非常に興味深い質問です。おそらく、pythonやコンピューティングやハードウェアに関連する理由があります。完全な答えを出すつもりはありませんが、ここに私が向かっていくものがあります。

最初に、タイプは言語によって定義され、ハードウェアアーキテクチャと異なる場合があります。たとえば、8ビットのプロセッサで2倍にすることもできます。もちろん、どの算術も複数のCPU命令を含んでいるため、計算が非常に遅くなります。それでも、あなたのアプリケーションがそれを必要とするならば、それは価値があるかもしれませんし、必要でさえあるかもしれません(間違ったより遅い方がいい、特にブリッジの安定性のためにシミュレーションを実行していると言えば...)。ここにwikipedia articleがあります...

もう1つ興味深いのは、コンピュータが64ビットと言うとき、これはハードウェアを完全には説明していないということです。 CPUの計算レジスタ、メモリ・アドレッシング・スキーム/メモリ・レジスタ、およびCPUからメモリへのバスを最も重要とするさまざまなバスが、それぞれ異なったビット(それぞれ少なくとも時々ある)であることがあります。

- ALU(算術論理装置)には計算を行うレジスタがあります。あなたのマシンは64ビットです(同様の時間に2つの32ビット計算を行うことができるかどうかは分かりません)。これは明らかにこの議論の最も関連する量です。あなたが外に出て、より高い精度の計算のためにそれをスピードアップするためにco-processorを買うことが以前のケースでした...

- コンピュータが(直接的に)見ることができるメモリを制限するレジスタは、そのため、32ビットのメモリレジスタを持つコンピュータでは2^32バイト(または約4 GB)しか見ることができませんでした.16ビットの場合、これは65Kと非常に低くなります。 OSはこの制限を回避する方法を見つけることができますが、1つのプログラムではできません。したがって、32ビットコンピュータのプログラムでは通常4GB以上のメモリがありません。

これらの制限は、ビットではなく、約バイトであることに注意してください。これは、メモリから参照およびロードするときにバイトをロードするためです。実際、これが行われる方法は、バイト(8ビット)または8(64ビット==バスの長さ)を読み込むのと同じ時間がかかります。私は住所を尋ね、バスを通ってすべてのビットを一度に取得します。 アーキテクチャでは、これらの量はすべて同じビット数ではありません。

-1

NumPyは驚くほど強力で、内部CPU表現(たとえば64ビット)よりもはるかに大きな数値を扱うことができます。

ダイナミックタイプの場合は、数値を配列に格納します。メモリブロックも拡張することができます。そのため、500桁の整数を持つことができます。この動的なタイプはbignumと呼ばれます。古いPythonバージョンでは、長いタイプでした。より新しいPython(3.0+)では長さがあり、intと呼ばれ、ほぼ任意の桁数( - > bignum)をサポートします。

データ型(たとえばint32)を指定すると、ビット長とビット形式、つまりメモリ内のビットが何を表すかを指定します。例:

dt = np.dtype(np.int32)  # 32-bit integer 
dt = np.dtype(np.complex128) # 128-bit complex floating-point number 

ルックで:https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

+1

128bitの複素数は通常の倍精度です – gerrit

+2

float32はsingle-、float64はdouble-、float96はfloat128、float128は拡張精度floatです。 複素数は2つの成分、すなわち各成分の半分の幅を有する。 complex64は単一であり、complex128は倍精度複素数である。 – Ralf

関連する問題