名前空間
変種
操作

浮動小数点リテラル

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブール - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

浮動小数点リテラルは、ソースファイルで値が指定されるコンパイル時定数を定義します。

目次

[編集] 構文

digit-sequence decimal-exponent suffix (オプション) (1)
digit-sequence . decimal-exponent (オプション) suffix (オプション) (2)
digit-sequence (オプション) . digit-sequence decimal-exponent (オプション) suffix (オプション) (3)
0x | 0X hex-digit-sequence hex-exponent suffix (オプション) (4) (C++17以降)
0x | 0X hex-digit-sequence . hex-exponent suffix (オプション) (5) (C++17以降)
0x | 0X hex-digit-sequence (オプション) . hex-digit-sequence hex-exponent suffix (オプション) (6) (C++17以降)
1) 小数点区切り記号のない整数を表す digit-sequence。この場合、指数は必須です: 1e101e-5L
2) 小数点区切り記号のある整数を表す digit-sequence。この場合、指数はオプションです: 1.1.e-2
3) 小数部分のある数値を表す digit-sequence。指数はオプションです: 3.14.1f0.1e-1L
4) 基数区切り記号のない整数を表す16進数の digit-sequence。16進浮動小数点リテラルの場合、指数は決してオプションではありません: 0x1ffp100X0p-1
5) 基数区切り記号のある整数を表す16進数の digit-sequence。16進浮動小数点リテラルの場合、指数は決してオプションではありません: 0x1.p00xf.p-1
6) 基数区切り記号のある小数部分の数を表す16進数の digit-sequence。16進浮動小数点リテラルの場合、指数は決してオプションではありません: 0x0.123p-10xa.bp10l

decimal-exponent は以下の形式です。

e | E exponent-sign (オプション) digit-sequence

hex-exponent は以下の形式です。

p | P exponent-sign (オプション) digit-sequence (C++17以降)

exponent-sign は、存在する場合、+ または - のいずれかです。

suffix は、存在する場合、flFLf16f32f64f128bf16F16F32F64F128BF16(C++23以降) のいずれかです。サフィックスは浮動小数点リテラルの型を決定します。

  • (サフィックスなし) は double を定義します。
  • f Ffloat を定義します。
  • l Llong double を定義します。
  • f16 F16std::float16_t を定義します。
  • f32 F32std::float32_t を定義します。
  • f64 F64std::float64_t を定義します。
  • f128 F128std::float128_t を定義します。
  • bf16 BF16std::bfloat16_t を定義します。
(C++23から)

オプションで、数字の間に区切り文字としてシングルクォート (') を挿入できます。これらはリテラルの値を決定する際には無視されます。

(C++14以降)

[編集] 説明

10進数の科学的記法が使用されます。これは、浮動小数点リテラルの値が、仮数に decimal-exponent の累乗である10を掛けたものであることを意味します。例えば、123e4 の数学的意味は 123×104 です。

浮動小数点リテラルが文字列 0x または 0X で始まる場合、その浮動小数点リテラルは _16進浮動小数点リテラル_ です。それ以外の場合は、_10進浮動小数点リテラル_ です。

_16進浮動小数点リテラル_ の場合、仮数は16進数の有理数として解釈され、指数の digit-sequence は、仮数をスケーリングする必要がある2の(10進数)整数べき乗として解釈されます。

double d = 0x1.4p3;// 16進小数 1.4 (10進数 1.25) を 23 でスケーリング。つまり 10.0

(C++17以降)

[編集] 備考

16進浮動小数点リテラルはC++17までC++の一部ではありませんでしたが、C++11以降、I/O関数で解析および出力できます。C++のI/Oストリーム (std::hexfloat が有効な場合) とCのI/Oストリーム (std::printfstd::scanf など) の両方で対応しています。std::strtof で書式の説明を参照してください。

機能テストマクロ 規格 機能
__cpp_hex_float 201603L (C++17) 16進浮動小数点リテラル

[編集]

#include <iomanip>
#include <iostream>
#include <limits>
#include <typeinfo>
 
#define OUT(x) '\n' << std::setw(16) << #x << x
 
int main()
{
    std::cout
        << "Literal" "\t" "Printed value" << std::left
        << OUT( 58.            ) // double
        << OUT( 4e2            ) // double
        << OUT( 123.456e-67    ) // double
        << OUT( 123.456e-67f   ) // float, truncated to zero
        << OUT( .1E4f          ) // float
        << OUT( 0x10.1p0       ) // double
        << OUT( 0x1p5          ) // double
        << OUT( 0x1e5          ) // integer literal, not floating-point
        << OUT( 3.14'15'92     ) // double, single quotes ignored (C++14)
        << OUT( 1.18e-4932l    ) // long double
        << std::setprecision(39)
        << OUT( 3.4028234e38f  ) // float
        << OUT( 3.4028234e38   ) // double
        << OUT( 3.4028234e38l  ) // long double
        << '\n';
 
    static_assert(3.4028234e38f == std::numeric_limits<float>::max());
 
    static_assert(3.4028234e38f ==  // ends with 4
                  3.4028235e38f);   // ends with 5
 
    static_assert(3.4028234e38 !=   // ends with 4
                  3.4028235e38);    // ends with 5
 
    // Both floating-point constants below are 3.4028234e38
    static_assert(3.4028234e38f !=  // a float (then promoted to double)
                  3.4028234e38);    // a double
}

実行結果の例

Literal         Printed value
58.             58
4e2             400
123.456e-67     1.23456e-65
123.456e-67f    0
.1E4f           1000
0x10.1p0        16.0625
0x1p5           32
0x1e5           485
3.14'15'92      3.14159
1.18e-4932l     1.18e-4932
3.4028234e38f   340282346638528859811704183484516925440
3.4028234e38    340282339999999992395853996843190976512
3.4028234e38l   340282339999999999995912555211526242304

[編集] 参照

  • C++23標準 (ISO/IEC 14882:2024)
  • 5.13.4 浮動小数点リテラル [lex.fcon]
  • C++20 standard (ISO/IEC 14882:2020)
  • 5.13.4 浮動小数点リテラル [lex.fcon]
  • C++17 standard (ISO/IEC 14882:2017)
  • 5.13.4 浮動小数点リテラル [lex.fcon]
  • C++14 standard (ISO/IEC 14882:2014)
  • 2.14.4 浮動小数点リテラル [lex.fcon]
  • C++11 standard (ISO/IEC 14882:2011)
  • 2.14.4 浮動小数点リテラル [lex.fcon]
  • C++98 標準 (ISO/IEC 14882:1998)
  • 2.13.3 浮動小数点リテラル [lex.fcon]

[編集] 関連項目

ユーザー定義リテラル(C++11) ユーザー定義サフィックス付きリテラル[編集]
Cドキュメント (浮動小数点定数)
English 日本語 中文(简体) 中文(繁體)