C ++標準では、float型の値の範囲はどこで定義されていますか?
-
08-07-2019 - |
質問
私が知る限り、浮動小数点値はn * 2 ^ eの形式で、
- フロート範囲はn =-(2 ^ 23-1)-(2 ^ 23-1)、およびe = -126-127、
- 二重範囲はn =-(2 ^ 52-1)-(2 ^ 52-1)で、e = -1022-1023
C ++規格を調べていましたが、規格がこれを指定している場所、またはfloat(double)型とlong double型と他の(IEEE)規格で定義された範囲との関連付けを義務付ける場所を見つけることができませんでした。 3.9.1.8で見つかった関連する唯一のものは次のとおりです。
float、double、およびlong doubleの3つの浮動小数点タイプがあります。 double型は少なくともfloatと同じ精度を提供し、long double型は少なくともdoubleと同じ精度を提供します。 float型の値のセットは、double型の値のセットのサブセットです。 double型の値のセットは、long double型の値のセットのサブセットです。浮動小数点型の値表現は実装定義です。
そして、そのタイプによって提供される最小範囲についての言及はありません。
どこで/どのように標準は浮動小数点型の(最小?)値の範囲を指定しますか?または、コンパイラが任意の値の範囲を自由に選択し、引き続き標準に準拠できますか?
解決
整数の数値制限と同様に、float
、double
、およびlong double
の制限はC標準からインポートされます。定数FLT_MAX
、DBL_MAX
、およびLDBL_MAX
の最小値は1E+37
です。 *_MIN
バリアントの最大値は1E-37
です。
他のヒント
引用したのは、C ++の浮動小数点型について保証されているすべてです。それが言うように、それらの表現は実装定義です。
ただし、std::numeric_limits
の<limits>
テンプレートを使用して、制限に関する情報と、タイプがIEC 559(IEEE 754)指定タイプであるかどうかを照会できます。
ハードウェアに依存し、時間とともに変化することが多いため、標準ではこのようなことを指定していません。今日では32ビットが標準と考えられていますが、10年以内に64ビット未満で作業を行うのは不快に思えるかもしれません。