Namespaces
Variants

Floating constant

From cppreference.net

Permite que los valores de tipo flotante se utilicen directamente en expresiones.

Contenidos

Sintaxis

Una constante flotante es una expresión no lvalue que tiene la forma:

significand exponent  (opcional) suffix  (opcional)

Donde el significand tiene la forma

número-entero  (opcional) . (opcional) fracción  (opcional)

El exponent tiene la forma

e | E signo-exponencial  (opcional) secuencia-de-dígitos (1)
p | P signo-exponencial  (opcional) secuencia-de-dígitos (2) (desde C99)
1) La sintaxis de exponente para una constante de punto flotante decimal
2) La sintaxis de exponente para constante de punto flotante hexadecimal

Se pueden insertar comillas simples opcionales ( ' ) entre los dígitos como separador, se ignoran durante la compilación.

(desde C23)

Explicación

Si el significand comienza con la secuencia de caracteres 0x o 0X , la constante flotante es una constante flotante hexadecimal . De lo contrario, es una constante flotante decimal .

Para una constante flotante hexadecimal , el significand se interpreta como un número racional hexadecimal, y la secuencia-de-dígitos del exponente se interpreta como la potencia entera de 2 por la cual debe escalarse el significando.

double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
(desde C99)

Para una constante flotante decimal , el significando se interpreta como un número racional decimal, y la secuencia-de-dígitos del exponente se interpreta como la potencia entera de 10 por la cual debe escalarse el significando.

double d = 1.2e3; // fracción decimal 1.2 escalada por 10^3, es decir 1200.0

Sufijos

Una constante flotante sin sufijo tiene tipo double . Si el sufijo es la letra f o F , la constante flotante tiene tipo float . Si el sufijo es la letra l o L , la constante flotante tiene tipo long double .

Si la implementación predefine la macro __STDC_IEC_60559_BFP__ , los siguientes sufijos y constantes flotantes correspondientes son adicionalmente soportados:

  • si suffix es df o DF , la constante flotante tiene tipo _Decimal32 ;
  • si suffix es dd o DD , la constante flotante tiene tipo _Decimal64 ;
  • si suffix es dl o DL , la constante flotante tiene tipo _Decimal128 .

Los sufijos para tipos decimales de coma flotante no están permitidos en constantes flotantes hexadecimales.

(desde C23)

Partes opcionales

Si el exponente está presente y la parte fraccionaria no se utiliza, el separador decimal puede omitirse:

double x = 1e0; // punto flotante 1.0 (no se utiliza punto)

Para las constantes flotantes decimales, la parte del exponente es opcional. Si se omite, el punto no es opcional, y debe estar presente ya sea la parte entera o la fracción .

double x = 1.; // punto flotante 1.0 (la parte fraccionaria es opcional)
double y = .1; // punto flotante 0.1 (la parte entera es opcional)

Para constantes flotantes hexadecimales, el exponente no es opcional para evitar ambigüedad resultante de que un sufijo f sea confundido con un dígito hexadecimal.

(desde C99)

Valores representables

El resultado de evaluar una constante flotante es el valor representable más cercano o el valor representable mayor o menor adyacente inmediato al valor representable más cercano, elegido de manera definida por la implementación (en otras palabras, la dirección de redondeo por defecto durante la traducción está definida por la implementación).

Todas las constantes flotantes de la misma forma fuente se convierten al mismo formato interno con el mismo valor. Las constantes flotantes de diferentes formas fuente, por ejemplo 1.23 y 1.230 , no necesitan convertirse al mismo formato interno y valor.

Las constantes de punto flotante pueden convertirse a un rango y precisión mayor que el indicado por su tipo, si así lo indica FLT_EVAL_METHOD . Por ejemplo, la constante 0.1f puede comportarse como si fuera 0.1L en una expresión.

El resultado de evaluar una constante hexadecimal de punto flotante, si FLT_RADIX es 2, es el valor exacto representado por la constante flotante, redondeado correctamente al tipo de destino.

(since C99)

Las constantes flotantes de tipo coma flotante decimal que tienen el mismo valor numérico x pero diferentes exponentes cuánticos, por ejemplo 1230 . dd , 1230.0dd , y 1.23e3dd , tienen representaciones internas distinguibles.

El exponente cuántico q de una constante flotante de un tipo coma flotante decimal se determina de manera que 10 q
represente 1 en la posición del último dígito del significando cuando sea posible. Si el exponente cuántico q y el coeficiente c=x·10 -q
determinados anteriormente no pueden representarse exactamente en el tipo de la constante flotante, q se incrementa según sea necesario dentro del límite del tipo, y c se reduce correspondientemente, con el redondeo necesario. El redondeo puede resultar en cero o infinito. Si (el posiblemente redondeado) c todavía está fuera del rango permitido después de que q alcance el valor máximo, la constante flotante resultante tiene el valor infinito positivo.

(desde C23)

Notas

Por defecto, la dirección de redondeo y la precisión están en efecto cuando las constantes flotantes se convierten en representaciones internas, y las excepciones de punto flotante no se generan incluso si #pragma STDC FENV_ACCESS está en efecto (para la conversión en tiempo de ejecución de cadenas de caracteres, strtod puede utilizarse). Nótese que esto difiere de las expresiones constantes aritméticas de tipo flotante.

Las letras en las constantes flotantes no distinguen entre mayúsculas y minúsculas , excepto que no se pueden usar mayúsculas y minúsculas simultáneamente en los sufijos para tipos decimales de punto flotante (desde C23) : 0x1 . ep + 3 y 0X1 . EP + 3 representan el mismo valor de punto flotante 15.0 .

El punto decimal especificado por setlocale no tiene efecto en la sintaxis de las constantes flotantes: el carácter del punto decimal siempre es el punto.

A diferencia de los enteros, no todos los valores flotantes pueden representarse directamente mediante sintaxis decimal o incluso hexadecimal (since C99) : las macros NAN e INFINITY así como funciones como nan ofrecen formas de generar esos valores especiales (since C99) . Nótese que 0x1 . FFFFFEp128f , que podría parecer un NaN float IEEE, de hecho desborda a un infinito en ese formato.

No existen constantes flotantes negativas; una expresión como - 1.2 es el operador aritmético menos unario aplicado a la constante flotante 1.2 . Nótese que el valor especial cero negativo puede construirse con - 0.0 .

Ejemplo

#include <stdio.h>
int main(void)
{
    printf("15.0     = %a\n", 15.0);
    printf("0x1.ep+3 = %f\n", 0x1.ep+3);
    // Constants outside the range of type double.
    printf("+2.0e+308 --> %g\n",  2.0e+308);
    printf("+1.0e-324 --> %g\n",  1.0e-324);
    printf("-1.0e-324 --> %g\n", -1.0e-324);
    printf("-2.0e+308 --> %g\n", -2.0e+308);
}

Salida:

15.0     = 0x1.ep+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.4.4.2 Constantes de punto flotante (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.4.4.2 Constantes de punto flotante (p: 47-48)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.4.4.2 Constantes de punto flotante (p: 65-66)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.4.4.2 Constantes de punto flotante (p: 57-58)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.1.3.1 Constantes de punto flotante

Véase también

Documentación de C++ para Literal de punto flotante