常に32ビット符号なし整数型にマップされるuint32_t
に類似した標準型があるかどうかを確認しようとしていましたが、見つかりませんでした。
float
のサイズは、すべてのプラットフォームで常に4バイトですか?double
のサイズは常に8ですか?
どちらの規格も問題について何か言っていますか?
すべてのプラットフォーム(x86とx64)でサイズが常に同じになるようにしたいので、標準のint型を使用していますが、float
とdouble
に類似したtypedefが見つかりませんでした。
C99標準、標準付属書Fからの抜粋(C++標準では、この付属書については明示的に言及していませんが、参照ごとに変更なしで影響を受けるすべての機能が含まれています。また、互換性のために型が一致する必要があります。):
IEC 60559浮動小数点演算
F.1はじめに
1この付録は、IEC 60559浮動小数点標準のC言語サポートを指定します。 IEC 60559浮動小数点標準は、特にマイクロプロセッサシステム用のバイナリ浮動小数点演算、第2版(IEC 60559:1989)、以前はIEC 559:1989と指定され、IEEEバイナリ浮動小数点標準として算術演算(ANSI/IEEE 754-1985)。基数に依存しない浮動小数点演算のIEEE標準(ANSI/IEEE 854-1987)は、基数とワード長への依存関係を削除するためにバイナリ標準を一般化します。 IEC 60559は一般に、IEC 60559操作、IEC 60559形式などの浮動小数点標準を指します。
__STDC_IEC_559__
を定義する実装は、この付録.356)C言語とIEC 60559の間のバインディングが示されている場合、特に明記しない限り、IEC 60559で指定された動作が参照により採用されます。負および正の無限大はIEC 60559形式で表現できるため、すべての実数は表現可能な値の範囲内にあります。
したがって、<math.h>
(またはC++では<cmath>
)を含め、__STDC_IEC_559__
をテストします。
マクロが定義されている場合、タイプがより適切に指定されるだけでなく(float
が32ビットで、double
がとりわけ64ビットである)、組み込み演算子および標準関数の動作もより詳細に指定されます。
マクロの欠如は保証を与えません。
X86およびx86_64(AMD64)の場合、タイプfloat
およびdouble
がIEC-60559準拠であることに依存できますが、それらを使用する関数およびそれらに対する操作はそうではない場合があります。
サイズについては何も言わない。
3.9.1.8
浮動小数点型には、float、double、およびlong doubleの3つがあります。 double型は少なくともfloatと同じ精度を提供し、long double型は少なくともdoubleと同じ精度を提供します。 float型の値のセットは、double型の値のセットのサブセットです。 double型の値のセットは、long double型の値のセットのサブセットです。浮動小数点型の値表現は実装定義です。整数型と浮動型は、算術型と総称されます。標準テンプレートstd :: numeric_limits(18.3)の特殊化では、実装の各算術型の最大値と最小値を指定しなければなりません。
C++標準は何も述べていませんが、ほとんどのプラットフォームで、C++はIEEEの単精度/倍精度標準を使用します。これは、単精度を4バイト、倍精度を8バイトとして定義します。
http://en.wikipedia.org/wiki/Single-precision_floating-point_formathttp://en.wikipedia.org/wiki/Double-precision_floating-point_format
これらのケースの例外についてはわかりません。
浮動小数点演算はCPUによって低レベルで実装されるため、C++標準ではfloat
、double
、またはlong double
のサイズは必須ではありません。それが言っているすべては、私がそれらを指定した順序が等しいか、または精度の昇順であるということです。
最善の策は、クロスプラットフォームの浮動小数点型を定義するために、static_assert
、sizeof
、typedef
、および#define
を慎重に使用することです。
X86の場合、IEEEの単精度および倍精度の数値を使用している場合でも、内部計算は浮動小数点制御ワード(FCW)の影響を受けます。内部計算は通常64ビットまたは80ビット(long double)です。インラインアセンブリコードを使用してこれをオーバーライドできますが、一部の倍精度ライブラリ関数が元に戻さないという保証はありません。
Microsoftは、16ビットコンパイラで80ビットのlong doubleをサポートしていましたが、32ビットおよび64ビットコンパイラでのサポートを廃止しました。longdoubleは、64ビットのdoubleと同じになりました。
クロスプラットフォームのデータ型の互換性を提供するライブラリを使用してみることができます。
」Cから継承されたC++の整数型はクロスプラットフォームの危険です。int、long、friendsはプラットフォームによってサイズが異なります(現在のシステムでは32ビットと64ビット、おそらく128ビット以降)。一部のアプリケーションでは、32ビット制限(符号なし整数を使用する場合は31ビット)に決して近づくことはないが、64ビットシステムでオブジェクトをシリアル化し、32ビットで逆シリアル化するため、無関係に見える場合がありますあなたが不愉快に驚くかもしれないシステム。
APRは、プラットフォームごとに異なる可能性のある基本型のtypedefのセットを提供します。これらのtypedefはサイズを保証し、ファジーな組み込み型を回避します。ただし、一部のアプリケーション(主に数値)では、最大のパフォーマンスを達成するためにネイティブマシンのWordサイズ(通常はintの略)を使用することが重要な場合があります。」
Gigi SAYFAN-独自のプラグインフレームワークの構築(From http://philippe.ameline.free.fr /techytechy/071125_PluginFramework.htm )
同じサイズのフロートがあったとしてもできませんこれらのフロートが異なるプラットフォームで等しく解釈されるようにしてください。 「floats over network」に関する多くの論文を読むことができます。フロートの非決定性は既知の問題です。