浮動小数点定数
浮動小数点型の値を式の中で直接使用できるようにします。
構文
浮動小数点定数は以下の形式を持つ非左辺値式です。
| significand exponent(オプション) suffix(オプション) | |||||||||
ただし significand は以下の形式を持ちます。
whole-number(オプション) .(オプション) fraction(オプション)
|
|||||||||
exponent は以下の形式を持ちます。
e | E exponent-sign(オプション) digit-sequence
|
(1) | ||||||||
p | P exponent-sign(オプション) digit-sequence
|
(2) | (C99以上) | |||||||
説明
|
significand が文字シーケンス 16進浮動小数点定数の場合、 significand は16進数の有理数として解釈され、指数の digit-sequence は仮数部をスケールしなければならない2の整数乗として解釈されます。 double d = 0x1.2p3; // 2^3でスケールした16進数の仮数部1.2 (10進数の1.125)、すなわち9.0
|
(C99以上) |
10進浮動小数点定数の場合、 significand は10進数の有理数として解釈され、指数の digit-sequence は仮数部をスケールしなければならない10の整数乗として解釈されます。
double d = 1.2e3; // 10^3でスケールした10進数の仮数部1.2、すなわち 1200.0
接尾辞のない浮動小数点定数は double 型です。 suffix が文字 f または F の場合、その浮動小数点定数は float 型です。 suffix が文字 l または L の場合、その浮動小数点定数は long double 型です。
浮動小数点定数を評価した結果は、処理系定義の方法によって選択された、その最も近い表現可能な値か、その最も近い表現可能な値に隣接するより大きな値または小さな値かの、いずれかです (別の言い方をすると、コンパイル中のデフォルトの丸めモードは処理系定義です)。
|
浮動小数点定数は、 FLT_EVAL_METHOD によって表されている場合、その型よりも広い範囲および高い精度に変換されることがあります。 たとえば、定数 |
(C99以上) |
|
16進浮動小数点定数の評価結果は、 FLT_RADIX が 2 であれば、その浮動小数点定数が表す正確な値をターゲットの型に正確に丸めたものです。 |
(C99以上) |
指数が存在し、小数部を使用しない場合は、小数点を省略しても構いません。
double x = 1e0; // 浮動小数点数 1.0 (小数点を省略しています)
10進浮動小数点定数の場合は、指数部は省略可能です。 指数部を省略する場合は、小数点は省略できず、整数部または小数部のいずれかが存在しなければなりません。
double x = 1.; // 浮動小数点数 1.0 (小数部を省略しています)
double y = .1; // 浮動小数点数 0.1 (整数部を省略しています)
|
16進浮動小数点定数の場合は、接尾辞 f が16進数として扱われる曖昧さを避けるため、指数部は省略できません。 |
(C99以上) |
ノート
浮動小数点定数が内部表現に変換されるときは、たとえ #pragma STDC FENV_ACCESS が使用されていても、デフォルトの丸め方向および精度が使用され、浮動小数点例外は発生しません (文字列を実行時に変換するためには、 strtod が使用できます)。 これは浮動小数点型の算術定数式と異なることに注意してください。
浮動小数点定数内の文字は大文字小文字を区別しません。 0x1.ep+3 と 0X1.EP+3 は同じ浮動小数点数値 15.0 を表します。
setlocale によって指定される小数点は浮動小数点定数の構文には効果がないことに注意してください。 小数点の文字は常にピリオドです。
整数と異なり、10進または16進定数の構文ですべての浮動小数点数値を直接表現できるわけではありません。 マクロ NAN、 INFINITY および nan などの関数は、それらの特別な値を生成する方法を提供します。 0x1.FFFFFEp128f (IEEE では NaN を表すかもしれません) は実際はオーバーフローして無限大になることに注意してください。
負の浮動小数点定数は存在しません。 -1.2 などの式は浮動小数点定数 1.2 に単項符号算術演算子を適用します。 特別な値である負のゼロを -0.0 で構築できるかもしれないことに注意してください。
例
#include <stdio.h>
int main(void)
{
printf("15.0 = %a\n", 15.0);
printf("0x1.ep+3 = %f\n", 0x1.ep+3);
// double 型の範囲外の定数。
printf("+2.0e+308 --> %g\n", 2.0e+308);
printf("+1.0e-324 --> %g\n", 1.0e-324);
printf("-1.0e-324 --> %g\n", -1.0e-324);
printf("-2.0e+308 --> %g\n", -2.0e+308);
}
出力:
15.0 = 0x1.ep+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.4.4.2 Floating constants (p: 65-66)
- C99 standard (ISO/IEC 9899:1999):
- 6.4.4.2 Floating constants (p: 57-58)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.1.3.1 Floating constants
関連項目
浮動小数点リテラル の C++リファレンス
|