Floating constant
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) | |||||||
|
Se pueden insertar comillas simples opcionales (
|
(desde C23) |
Explicación
|
Si el
significand
comienza con la secuencia de caracteres
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
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
|
(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
|
(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
|