Namespaces
Variants

Floating-point literal

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Литерал с плавающей точкой определяет константу времени компиляции, значение которой задается в исходном файле.

Содержание

Синтаксис

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 представляющая целое число без десятичного разделителя, в этом случае экспонента не является опциональной: 1e10 , 1e - 5L .
2) digit-sequence представляющая целое число с десятичным разделителем, в этом случае экспонента является необязательной: 1 . , 1. e -2 .
3) последовательность-цифр представляющая дробное число. Показатель степени опционален: 3.14 , .1f , 0.1e - 1L .
4) Шестнадцатеричная digit-sequence , представляющая целое число без разделителя основания системы счисления. Экспонента никогда не является опциональной для шестнадцатеричных литералов с плавающей точкой: 0x1ffp10 , 0X0p - 1 .
5) Шестнадцатеричная digit-sequence , представляющая целое число с разделителем основания системы счисления. Экспонента никогда не является опциональной для шестнадцатеричных литералов с плавающей точкой: 0x1 . p0 , 0xf . p - 1 .
6) Шестнадцатеричная digit-sequence , представляющая дробное число с разделителем основания системы счисления. Экспонента никогда не является опциональной для шестнадцатеричных литералов с плавающей точкой: 0x0.123p - 1 , 0xa . bp10l .

decimal-exponent имеет вид

e | E знак-экспоненты  (необязательно) последовательность-цифр

hex-exponent имеет вид

p | P exponent-sign  (optional) digit-sequence (since C++17)

exponent-sign , если присутствует, является либо + , либо -

суффикс , если присутствует, является одним из f , l , F , L , f16 , f32 , f64 , f128 , bf16 , F16 , F32 , F64 , F128 , BF16 (начиная с C++23) . Суффикс определяет тип плавающего литерала:

  • (без суффикса) определяет double
  • f F определяет float
  • l L определяет long double
  • f16 F16 определяет std::float16_t
  • f32 F32 определяет std::float32_t
  • f64 F64 определяет std::float64_t
  • f128 F128 определяет std::float128_t
  • bf16 BF16 определяет std::bfloat16_t
(начиная с C++23)

Между цифрами могут быть вставлены необязательные одинарные кавычки ( ' ) в качестве разделителя; они игнорируются при определении значения литерала.

(since C++14)

Объяснение

Используется десятичная научная нотация, означающая, что значение литерала с плавающей точкой представляет собой мантиссу, умноженную на число 10, возведенное в степень decimal-exponent . Например, математическое значение 123e4 равно 123×10 4 .

Если плавающий литерал начинается с последовательности символов 0x или 0X , то плавающий литерал является шестнадцатеричным плавающим литералом . В противном случае это десятичный плавающий литерал .

Для шестнадцатеричного плавающего литерала мантисса интерпретируется как шестнадцатеричное рациональное число, а последовательность-цифр экспоненты интерпретируется как (десятичная) целая степень 2, на которую должна быть масштабирована мантисса.

double d = 0x1.4p3 ; // шестнадцатеричная дробь 1.4 (десятичная 1.25) масштабированная на 2 3 , то есть 10.0

(since C++17)

Примечания

Шестнадцатеричные литералы с плавающей точкой не были частью C++ до стандарта C++17, хотя они могут обрабатываться и выводиться функциями ввода-вывода начиная с C++11: как потоки ввода-вывода C++ при включенном std::hexfloat , так и потоки ввода-вывода C: std::printf , std::scanf и др. Описание формата см. в std::strtof .

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_hex_float 201603L (C++17) Шестнадцатеричные плавающие литералы

Пример

#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 (ISO/IEC 14882:2020):
  • 5.13.4 Литералы с плавающей точкой [lex.fcon]
  • Стандарт C++17 (ISO/IEC 14882:2017):
  • 5.13.4 Плавающие литералы [lex.fcon]
  • Стандарт C++14 (ISO/IEC 14882:2014):
  • 2.14.4 Вещественные литералы [lex.fcon]
  • Стандарт C++11 (ISO/IEC 14882:2011):
  • 2.14.4 Вещественные литералы [lex.fcon]
  • Стандарт C++98 (ISO/IEC 14882:1998):
  • 2.13.3 Плавающие литералы [lex.fcon]

Смотрите также

пользовательские литералы (C++11) литералы с пользовательским суффиксом
документация C для Плавающая константа