2017-03-03 3 views
1

floatdoubleタイプのメモリフォーマットを見つけるには?浮動小数点型のメモリフォーマットを見つける

これは、符号、指数、および分数のビット数を意味します。

+2

ほとんど常にIEEE 754のITをプロービングすることによって

。 ['std :: numeric_limits :: is_iec559'](http://en.cppreference.com/w/cpp/types/numeric_limits/is_iec559)を使用しているかどうかを確認できます。 'std :: numeric_limits'はあなたの型の多くのプロパティをチェックすることができますが、正確なメモリレイアウトは含まれていません。 –

+1

これは実装によって文書化されるべきです。 – NathanOliver

+1

あなたは 'float memory format'のためのグーグルを試みましたか?これらのタイプはCPUによって直接サポートされ、特定の標準に従います。最初のGoogleの結果は[倍精度浮動小数点形式](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)です。 CPUがIEEE 754規格に準拠していない場合は、CPUのマニュアルを確認する必要があります。 –

答えて

1

、私のgithubのプロジェクトを調べる

https://github.com/MalcolmMcLean/ieee754

私もそれが少し複雑ですと、可搬性進整数を読み込むための関数に入れています最初の視界に現れるよりも。

メモリ形式をテストする場合は、特定の戦略的な値を持つ浮動小数点数を作成し、次にビットパターンを照会する必要があります。奇妙で素晴らしいハードウェアを使用している場合を除き、ゼロはすべてゼロのビットと特殊なケースにする必要があります。 1と-1は1ビット違いです。これは符号ビットです。 2と1は指数部が異なる必要があり、2のテスト能力は指数部のビットとそれがなくなった時を示すはずです。速度の2の累乗の力を試してみてください。

次に、1を2の累乗(例えば3,7など)で保存することで仮数を得ることができます。あなたは、メモリのパターンを構築することができますが、それは `float`と` double`のフォーマットは、*通常* IEEE-754ですが、これを保証するものではありません

+0

コードのライセンスは何ですか? –

+0

無料です。そのような数学的ルーチンは特許を取ることができません。 –

2

これは、符号、指数、および小数部のビット数を意味します。

あなたは、符号ビットを取得するためにstd::numeric_limits<T>::is_signed、仮数部のビットを取得するためにstd::numeric_limits<T>::digitsを使用することができます。

あなたは指数の数字を推測するために合計を​​から差し引きますが、タイプにパディングがある場合は正しくないことがあります。例えば、long doubleの場合はこれが典型的です。

、もちろん

問題のビット数でなく、順序だけでなく、float型のメモリ形式を検索します。これらの機能はあなたを助けません。彼らはまた、std::numeric_limits<T>::radix == 2と仮定します。

正確なフォーマットについては、cpu architechtureのマニュアルを参照する必要があります。


は私がハードディスクに浮動小数点数を保存すると、ファイルのクロスプラットフォームを作るための良い方法があるかどうだろうか。

最も一般的な解決策は、ディスクに保存するときに浮動小数点をテキスト表現に変換することです。0x1.8p+0。それは最も効率的ではありませんが、移植性があります(ただし、ファイルがどの文字エンコーディングを使用するかを決める必要があります。システムにネイティブでない場合、変換が必要です)。クロスプラットフォームの方法で、ディスクへの浮動小数点数を保存するには

関連する問題