Floating constant
浮動小数点型の値を式内で直接使用できるようにします。
目次 |
構文
浮動小数点定数は以下の形式を持つ non-lvalue 式です:
| significand exponent (optional) suffix (optional) | |||||||||
significand が次の形式を持つ場合
整数部
(オプション)
.
(オプション)
小数部
(オプション)
|
|||||||||
指数部は以下の形式を持ちます
e
|
E
exponent-sign
(optional)
digit-sequence
|
(1) | ||||||||
p
|
P
exponent-sign
(optional)
digit-sequence
|
(2) | (C99以降) | |||||||
|
オプションのシングルクォート(
|
(C23以降) |
説明
|
仮数部が文字シーケンス
16進浮動小数点定数 の場合、仮数部は16進有理数として解釈され、指数部の数字シーケンスは仮数部をスケーリングする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; // 10進小数1.2を10^3倍したもの、つまり1200.0
サフィックス
サフィックスなしの浮動小数点定数は
double
型を持ちます。
suffix
が文字
f
または
F
の場合、浮動小数点定数は
float
型を持ちます。
suffix
が文字
l
または
L
の場合、浮動小数点定数は
long
double
型を持ちます。
|
実装がマクロ
十進浮動小数点型の接尾辞は、十六進浮動小数点定数では使用できません。 |
(C23以降) |
オプション部分
指数が存在し、小数部分が使用されていない場合、小数点区切り文字は省略されることがあります:
double x = 1e0; // 浮動小数点 1.0 (ピリオドは使用されていません)
10進浮動小数点定数では、 exponent 部分は省略可能です。これを省略した場合、ピリオドは省略できず、 whole-number または fraction のいずれかが存在しなければなりません。
double x = 1.; // 浮動小数点 1.0(小数部は省略可能) double y = .1; // 浮動小数点 0.1(整数部は省略可能)
|
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
は、
10
q
|
(C23以降) |
注記
浮動小数点定数が内部表現に変換される際には、デフォルトの 丸め方向 および 精度 が適用され、 浮動小数点例外 は発生しません( #pragma STDC FENV_ACCESS が有効な場合でも同様です。文字列の実行時変換については、 strtod を使用できます)。これは浮動小数点型の 算術定数式 とは異なることに注意してください。
浮動小数点定数内の文字は大文字小文字を区別しません 、ただし10進浮動小数点型のサフィックスでは大文字と小文字を同時に使用できないことを除く (C23以降) : 0x1 . ep + 3 と 0X1 . EP + 3 は同じ浮動小数点値 15.0 を表します。
setlocale によって指定される小数点は、浮動小数点定数の構文に影響を与えません:小数点文字は常にピリオドです。
整数とは異なり、すべての浮動小数点値を10進数 あるいは16進数 (C99以降) の定数構文で直接表現できるわけではありません : マクロ NAN および INFINITY 、さらに nan などの関数は、これらの特殊な値を生成する方法を提供します (C99以降) 。なお、 0x1 . FFFFFEp128f は一見IEEE浮動小数点数のNaNのように見えますが、実際にはその形式では無限大にオーバーフローします。
負の浮動小数点定数は存在しません。例えば - 1.2 のような式は、浮動小数点定数 1.2 に 算術演算子 の単項マイナスを適用したものです。特殊な値である負のゼロは - 0.0 で構築できることに注意してください。
例
出力:
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 浮動小数点定数 (p: TBD)
- C17規格 (ISO/IEC 9899:2018):
-
- 6.4.4.2 浮動小数点定数 (p: 47-48)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.4.4.2 浮動小数点定数 (p: 65-66)
- C99規格 (ISO/IEC 9899:1999):
-
- 6.4.4.2 浮動小数点定数 (p: 57-58)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.1.3.1 浮動小数点定数
関連項目
|
C++ documentation
for
Floating-point literal
|
|
C++ documentation
の
Floating-point literal
|