Namespaces
Variants

Floating constant

From cppreference.net

浮動小数点型の値を式内で直接使用できるようにします。

目次

構文

浮動小数点定数は以下の形式を持つ 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以降)
1) 10進浮動小数点定数の指数表記構文
2) 16進浮動小数点定数の指数構文

オプションのシングルクォート( ' )を数字の間に区切り文字として挿入できます。これらはコンパイル時に無視されます。

(C23以降)

説明

仮数部が文字シーケンス 0x または 0X で始まる場合、その浮動小数点定数は 16進浮動小数点定数 です。それ以外の場合は 10進浮動小数点定数 です。

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 型を持ちます。

実装がマクロ __STDC_IEC_60559_BFP__ を事前定義している場合、以下の接尾辞と対応する浮動小数点定数が追加でサポートされます:

  • suffix df または DF の場合、浮動小数点定数の型は _Decimal32 となる;
  • suffix dd または DD の場合、浮動小数点定数の型は _Decimal64 となる;
  • suffix dl または DL の場合、浮動小数点定数の型は _Decimal128 となる。

十進浮動小数点型の接尾辞は、十六進浮動小数点定数では使用できません。

(C23以降)

オプション部分

指数が存在し、小数部分が使用されていない場合、小数点区切り文字は省略されることがあります:

double x = 1e0; // 浮動小数点 1.0 (ピリオドは使用されていません)

10進浮動小数点定数では、 exponent 部分は省略可能です。これを省略した場合、ピリオドは省略できず、 whole-number または fraction のいずれかが存在しなければなりません。

double x = 1.; // 浮動小数点 1.0(小数部は省略可能)
double y = .1; // 浮動小数点 0.1(整数部は省略可能)

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 は、 10 q
が可能な場合に significand の最後の桁の位置で1を表すように決定される。上記で決定された量子指数 q と係数 c=x·10 -q
が浮動小数点定数の型で正確に表現できない場合、 q は型の制限内で必要に応じて増加され、 c はそれに応じて減少され、必要な丸めが行われる。丸めによりゼロまたは無限大が生じる可能性がある。(丸められた可能性のある) c 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 で構築できることに注意してください。

#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

参考文献

  • 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
変更点: - "for" を "の" に翻訳 - HTMLタグ、属性、C++用語(Floating-point literal)は翻訳せず保持 - 元のフォーマットを完全に維持