浮動小数点定数
浮動小数点型 の値を式に直接使用できます。
目次 |
[編集] 構文
浮動小数点定数 は、以下の形式の 非l値 式です。
| significand exponent (任意) suffix (任意) | |||||||||
ここで significand は以下の形式をとります。
whole-number (任意) .(任意) fraction (任意) |
|||||||||
ここで exponent は以下の形式をとります。
e | E exponent-sign (任意) digit-sequence |
(1) | ||||||||
p | P exponent-sign (任意) digit-sequence |
(2) | (C99以降) | |||||||
|
数字の間に単一引用符( |
(C23以降) |
[編集] 説明
|
もし significand が `0x` または `0X` という文字シーケンスで始まる場合、その浮動小数点定数は *16進浮動小数点定数* です。それ以外の場合は *10進浮動小数点定数* です。 *16進浮動小数点定数* の場合、significand は16進数の有理数として解釈され、指数の digit-sequence は、significand をべき乗すべき2の整数べき乗として解釈されます。 double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 |
(C99以降) |
*10進浮動小数点定数* の場合、significand は10進数の有理数として解釈され、指数の digit-sequence は、significand をべき乗すべき10の整数べき乗として解釈されます。
double d = 1.2e3; // decimal fraction 1.2 scaled by 10^3, that is 1200.0
[編集] サフィックス
サフィックスのない浮動小数点定数は `double` 型です。もし suffix が文字 `f` または `F` の場合、浮動小数点定数は `float` 型になります。もし suffix が文字 `l` または `L` の場合、浮動小数点定数は `long double` 型になります。
|
実装がマクロ `__STDC_IEC_60559_BFP__` を事前に定義している場合、以下のサフィックスと対応する浮動小数点定数が追加でサポートされます。
10進浮動小数点型のサフィックスは、16進浮動小数点定数では許可されません。 |
(C23以降) |
[編集] 省略可能な部分
指数が存在し、小数部分が使用されていない場合、小数点区切り文字は省略されることがあります。
double x = 1e0; // floating-point 1.0 (period not used)
10進浮動小数点定数では、exponent 部分は省略可能です。省略された場合、ピリオドは省略できず、whole-number または fraction のいずれかが存在する必要があります。
double x = 1.; // floating-point 1.0 (fractional part optional) double y = .1; // floating-point 0.1 (whole-number part optional)
|
16進浮動小数点定数では、`f` サフィックスが16進数の一部と誤解される曖昧さを避けるため、指数は省略できません。 |
(C99以降) |
[編集] 表現可能な値
浮動小数点定数の評価結果は、最も近い表現可能な値、または最も近い表現可能な値に隣接するより大きいか小さい表現可能な値のいずれかであり、実装定義の方法で選択されます(つまり、翻訳時の デフォルトの丸め方向 は実装定義です)。
同じソース形式の浮動小数点定数は、すべて同じ内部形式で同じ値に変換されます。異なるソース形式の浮動小数点定数、例えば 1.23 と 1.230 は、必ずしも同じ内部形式と値に変換されるとは限りません。
|
浮動小数点定数は、FLT_EVAL_METHOD によって示される場合、その型によって示されるよりも広い範囲と精度に変換されることがあります。例えば、定数 0.1f は、式の中で `0.1L` のように扱われることがあります。 FLT_RADIX が 2 の場合、16進浮動小数点定数の評価結果は、浮動小数点定数によって表される正確な値であり、ターゲット型に正しく丸められます。 |
(C99以降) |
|
同じ数値 x を持つ10進浮動小数点型の浮動小数点定数で、量子指数が異なるもの(例: 1230.dd、1230.0dd、および 1.23e3dd)は、区別可能な内部表現を持ちます。 10進浮動小数点型の浮動小数点定数の量子指数 q は、10q |
(C23以降) |
[編集] 注意
浮動小数点定数が内部表現に変換される際には、デフォルトの丸め方向と精度が有効になります。また、 #pragma STDC FENV_ACCESS が有効な場合でも、浮動小数点例外は発生しません(文字列の実行時変換には、strtod を使用できます)。これは、浮動小数点型の算術定数式とは異なることに注意してください。
浮動小数点定数中の文字は、大文字・小文字を区別しませんただし、C23以降、10進浮動小数点型のサフィックスでは大文字と小文字を混在させることはできません(since C23)。例えば、0x1.ep+3 と 0X1.EP+3 は、同じ浮動小数点値 15.0 を表します。
setlocale によって指定された小数点の区切り文字は、浮動小数点定数の構文には影響しません。小数点文字は常にピリオドです。
整数とは異なり、すべての浮動小数点値を10進数、あるいは16進数(since C99)の定数構文で直接表現できるわけではありません。マクロ NAN や INFINITY、または nan のような関数は、これらの特殊な値を生成する方法を提供します(since C99)。なお、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); // Constants outside the range of type 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
[編集] 参考文献
- C23標準 (ISO/IEC 9899:2024)
- 6.4.4.2 Floating constants (p: TBD)
- C17標準 (ISO/IEC 9899:2018)
- 6.4.4.2 Floating constants (p: 47-48)
- C11標準 (ISO/IEC 9899:2011)
- 6.4.4.2 Floating constants (p: 65-66)
- C99標準 (ISO/IEC 9899:1999)
- 6.4.4.2 Floating constants (p: 57-58)
- C89/C90標準 (ISO/IEC 9899:1990)
- 3.1.3.1 Floating constants
[編集] 関連項目
| C++ドキュメント (浮動小数点リテラル)
|