Floating-point literal
El literal de punto flotante define una constante en tiempo de compilación cuyo valor se especifica en el archivo fuente.
Contenidos |
Sintaxis
| digit-sequence decimal-exponent suffix (opcional) | (1) | ||||||||
digit-sequence
.
decimal-exponent
(opcional)
suffix
(opcional)
|
(2) | ||||||||
digit-sequence
(opcional)
.
digit-sequence
decimal-exponent
(opcional)
suffix
(opcional)
|
(3) | ||||||||
0x
|
0X
hex-digit-sequence
hex-exponent
suffix
(opcional)
|
(4) | (desde C++17) | |||||||
0x
|
0X
hex-digit-sequence
.
hex-exponent
suffix
(opcional)
|
(5) | (desde C++17) | |||||||
0x
|
0X
hex-digit-sequence
(opcional)
.
hex-digit-sequence
hex-exponent
suffix
(opcional)
|
(6) | (desde C++17) | |||||||
decimal-exponent tiene la forma
e
|
E
exponente-signo
(opcional)
secuencia-dígitos
|
|||||||||
hex-exponent tiene la forma
p
|
P
signo-exponencial
(opcional)
secuencia-dígitos
|
(desde C++17) | ||||||||
exponent-sign
, si está presente, es
+
o
-
sufijo
, si está presente, es uno de
f
,
l
,
F
,
L
,
f16
,
f32
,
f64
,
f128
,
bf16
,
F16
,
F32
,
F64
,
F128
,
BF16
(desde C++23)
. El sufijo determina el tipo del literal de punto flotante:
-
- (sin sufijo) define double
-
f Fdefine float -
l Ldefine long double
|
(desde C++23) |
|
Se pueden insertar comillas simples opcionales ( ' ) entre los dígitos como separador; se ignoran al determinar el valor del literal. |
(since C++14) |
Explicación
Se utiliza la notación científica decimal, lo que significa que el valor del literal de punto flotante es el significando multiplicado por el número 10 elevado a la potencia del decimal-exponent . Por ejemplo, el significado matemático de 123e4 es 123×10 4 .
|
Si el literal flotante comienza con la secuencia de caracteres
Para un literal flotante hexadecimal , el significando se interpreta como un número racional hexadecimal, y la secuencia-de-dígitos del exponente se interpreta como la potencia (decimal) entera de 2 por la cual debe escalarse el significando.
double
d
=
0x1.4p3
;
|
(since C++17) |
Notas
Los literales de punto flotante hexadecimales no formaban parte de C++ hasta C++17, aunque pueden ser analizados e impresos por las funciones de E/S desde C++11: tanto los flujos de E/S de C++ cuando std::hexfloat está habilitado como los flujos de E/S de C: std::printf , std::scanf , etc. Consulte std::strtof para la descripción del formato.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_hex_float
|
201603L
|
(C++17) | Literales flotantes hexadecimales |
Ejemplo
#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 }
Salida posible:
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
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 5.13.4 Literales de punto flotante [lex.fcon]
- Estándar C++20 (ISO/IEC 14882:2020):
-
- 5.13.4 Literales de punto flotante [lex.fcon]
- Estándar C++17 (ISO/IEC 14882:2017):
-
- 5.13.4 Literales de punto flotante [lex.fcon]
- Estándar C++14 (ISO/IEC 14882:2014):
-
- 2.14.4 Literales de punto flotante [lex.fcon]
- Estándar C++11 (ISO/IEC 14882:2011):
-
- 2.14.4 Literales de punto flotante [lex.fcon]
- Estándar C++98 (ISO/IEC 14882:1998):
-
- 2.13.3 Literales de punto flotante [lex.fcon]
Véase también
| literales definidos por el usuario (C++11) | literales con sufijo definido por el usuario |
|
Documentación de C
para
Constante de punto flotante
|
|