Литерал с плавающей запятой
Литерал с плавающей запятой определяет константу времени компиляции, значение которой указано в исходном файле.
Синтаксис
| последовательность-цифр десятичная-экспонента суффикс (необязательно) | (1) | ||||||||
последовательность-цифр . десятичная-экспонента (необязательно) суффикс (необязательно)
|
(2) | ||||||||
последовательность-цифр (необязательно) . последовательность-цифр десятичная-экспонента (необязательно) суффикс (необязательно)
|
(3) | ||||||||
0x | 0X последовательность-шестнадцатеричных-цифр шестнадцатеричная-экспонента суффикс (необязательно)
|
(4) | (начиная с C++17) | |||||||
0x | 0X последовательность-шестнадцатеричных-цифр . шестнадцатеричная-экспонента суффикс (необязательно)
|
(5) | (начиная с C++17) | |||||||
0x | 0X последовательность-шестнадцатеричных-цифр (необязательно) . последовательность-шестнадцатеричных-цифр шестнадцатеричная-экспонента суффикс (необязательно)
|
(6) | (начиная с C++17) | |||||||
1e10, 1e-5L.1., 1.e-2.3.14, .1f, 0.1e-1L.0x1ffp10, 0X0p-1.0x1.p0, 0xf.p-1.0x0.123p-1, 0xa.bp10l.десятичная-экспонента имеет форму
e | E знак-экспоненты (необязательно) последовательность-цифр
|
|||||||||
шестнадцатеричная-экспонента имеет форму
p | P знак-экспоненты (необязательно) последовательность-цифр
|
(начиная с C++17) | ||||||||
знак-экспоненты, если присутствует, это либо +, либо -
суффикс, если присутствует, является одним из f, l, F, L, f16, f32, f64, f128, bf16, F16, F32, F64, F128, BF16 (начиная с C++23).
Суффикс определяет тип литерала с плавающей запятой:
- (без суффикса) определяет
double f Fопределяетfloatl Lопределяетlong double
- (без суффикса) определяет
|
(начиная с C++23) |
|
Необязательные одинарные кавычки ( |
(начиная с C++14) |
Объяснение
Используется десятичная экспоненциальная запись, означающая, что значение литерала с плавающей запятой представляет собой мантиссу, умноженную на число 10, возведённое в степень десятичной-экспоненты. Например, математическое значение 123e4 равно 123×104.
|
Если литерал с плавающей запятой начинается с последовательности символов Для шестнадцатеричного литерала с плавающей запятой, мантисса интерпретируется как шестнадцатеричное рациональное число, а последовательность-цифр экспоненты интерпретируется как (десятичная) целая степень числа 2, на которую должно быть масштабировано значение. double d = 0x1.4p3; // шестнадцатеричная дробь 1.4 (десятичная 1.25) в масштабе 2^3,
// то есть 10.0
|
(начиная с 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>
int main()
{
std::cout
<< "Литерал " << "Напечатанное значение"
<< "\n58. " << 58. // double
<< "\n4e2 " << 4e2 // double
<< "\n123.456e-67 " << 123.456e-67 // double
<< "\n123.456e-67f " << 123.456e-67f // float, усечённое до нуля
<< "\n.1E4f " << .1E4f // float
<< "\n0x10.1p0 " << 0x10.1p0 // double
<< "\n0x1p5 " << 0x1p5 // double
<< "\n0x1e5 " << 0x1e5 // целочисленный литерал,
// а не с плавающей запятой
<< "\n3.14'15'92 " << 3.14'15'92 // double, одинарные кавычки игнорируются (C++14)
<< "\n1.18e-4932l " << 1.18e-4932l // long double
<< std::setprecision(39)
<< "\n3.4028234e38f " << 3.4028234e38f // float
<< "\n3.4028234e38 " << 3.4028234e38 // double
<< "\n3.4028234e38l " << 3.4028234e38l // long double
<< '\n';
static_assert(3.4028234e38f == std::numeric_limits<float>::max());
static_assert(3.4028234e38f == // заканчивается на 4
3.4028235e38f); // заканчивается на 5
static_assert(3.4028234e38 != // заканчивается на 4
3.4028235e38); // заканчивается на 5
// Обе приведённые ниже константы с плавающей запятой равны 3.4028234e38
static_assert(3.4028234e38f != // float (затем расширено до double)
3.4028234e38); // double
}
Возможный вывод:
Литерал Напечатанное значение
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:2023):
- 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 по Константа с плавающей запятой
| |