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

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)
1) secuencia-de-dígitos que representa un número entero sin separador decimal, en este caso el exponente no es opcional: 1e10 , 1e - 5L .
2) digit-sequence que representa un número entero con un separador decimal, en este caso el exponente es opcional: 1 . , 1. e -2 .
3) secuencia-de-dígitos que representa un número fraccionario. El exponente es opcional: 3.14 , .1f , 0.1e - 1L .
4) Secuencia de dígitos digit-sequence hexadecimal que representa un número entero sin separador de base. El exponente nunca es opcional para literales de punto flotante hexadecimales: 0x1ffp10 , 0X0p - 1 .
5) Dígito hexadecimal digit-sequence que representa un número entero con un separador de base. El exponente nunca es opcional para literales hexadecimales de punto flotante: 0x1 . p0 , 0xf . p - 1 .
6) Dígito hexadecimal digit-sequence que representa un número fraccionario con un separador de base. El exponente nunca es opcional para literales de punto flotante hexadecimales: 0x0.123p - 1 , 0xa . bp10l .

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 F define float
  • l L define long double
  • f16 F16 define std::float16_t
  • f32 F32 define std::float32_t
  • f64 F64 define std::float64_t
  • f128 F128 define std::float128_t
  • bf16 BF16 define std::bfloat16_t
(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 0x o 0X , el literal flotante es un literal flotante hexadecimal . De lo contrario, es un literal flotante decimal .

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 ; // fracción hexadecimal 1.4 (decimal 1.25) escalada por 2 3 , es decir 10.0

(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