Intel ベースのシステムで C++ が使用する single または double 型のバイナリ形式について知りたいと思っています。
データが別のシステム (ファイルやネットワークなど) によって読み書きされる可能性がある場合に備えて、浮動小数点数の使用を避けてきました。代わりに固定小数点数を使用できること、およびその固定小数点の方が正確であることは認識していますが、浮動小数点形式について知りたいと思っています。
Intel ベースのシステムで C++ が使用する single または double 型のバイナリ形式について知りたいと思っています。
データが別のシステム (ファイルやネットワークなど) によって読み書きされる可能性がある場合に備えて、浮動小数点数の使用を避けてきました。代わりに固定小数点数を使用できること、およびその固定小数点の方が正確であることは認識していますが、浮動小数点形式について知りたいと思っています。
ウィキペディアに妥当な要約があります。http://en.wikipedia.org/wiki/IEEE_754を参照してください。
システム間で数値を転送したい場合は、バイナリ形式で行うことは避けてください。CORBA (冗談ですが)、Tibco などのミドルウェアを使用するか、昔からのお気に入りのテキスト表現に頼ってください。
これで始められるはずです: http://docs.sun.com/source/806-3568/ncg_goldberg.html。(:
他のポスターが指摘しているように、最新のすべてのプロセッサで使用されているIEEE形式に関する情報はたくさんありますが、問題が発生する場所ではありません。
IEEE形式を使用する最新のシステムに依存できますが、バイト順序を監視する必要があります。ウィキペディア(または他の場所)で「エンディアン」を検索します。Intelシステムはリトルエンディアンであり、多くのRISCプロセッサはビッグエンディアンです。2つの間での交換は簡単ですが、使用しているタイプを知る必要があります。
伝統的に、人々は送信にビッグエンディアン形式を使用します。使用しているバイト順序を示すヘッダーが含まれている場合があります。
絶対的な移植性が必要な場合、最も簡単なのはテキスト表現を使用することです。ただし、完全な精度を取得したい場合は、浮動小数点数に対してかなり冗長になる可能性があります。0.1234567890123456e+123。
浮動小数点形式は、言語やコンパイラではなく、プロセッサによって決定されます。最近では、ほぼすべてのプロセッサ (すべての Intel デスクトップ マシンを含む) に、浮動小数点ユニットがないか、IEEE 754 に準拠したものがあります。 1 つは符号ビット、指数、仮数を持ちます。数値は通常、次の式で表されます。
sign * (2**(E-k)) * (1 + S / (2**k'))
ここで、k' は仮数部のビット数で、k は指数の中間範囲の定数です。ゼロ (プラスおよびマイナス ゼロ) だけでなく、無限大やその他の "非数" (NaN) 値の特別な表現があります。
明確な癖があります。たとえば、分数の 1/10 は、2 進数の IEEE 標準浮動小数点数として正確に表すことはできません。このため、IEEE 標準では 10 進数表現も規定されていますが、これは主にハンドヘルド計算機で使用され、汎用コンピューターでは使用されません。
推奨読書: David Golberg のWhat Every Computer Scientist Should Know About Floating-Point Arithmetic
Intel の表現は、IEEE 754 に準拠しています。詳細はhttp://download.intel.com/technology/itj/q41999/pdf/ia64fpbf.pdfで確認できます。
10 進浮動小数点定数は、異なるシステムでは異なる浮動小数点 2 進数値に変換される場合があることに注意してください (同じシステムで異なるコンパイラを使用した場合でも)。違いはわずかです -- おそらく double の場合は 2^-54 程度です -- しかし、それでも違いはあります。
どのプラットフォームでも同じ浮動小数点バイナリ値を保証する場合は、16 進定数を使用します。