constante flotante hexadecimal en C

0x0.3p10 representa qué valor?

¿Y cuál es el significado de la p en la statement anterior?

0x0.3p10 es un ejemplo de un literal de coma flotante hexadecimal, introducido en C99. La p separa el número base del exponente.

El bit 0x0.3 se llama parte significativa (todo con fracción opcional) y el exponente es la potencia de dos por la que se escala.

Ese valor particular se calcula como 0.3 en hex, o 3 * 16 -1 ( 3/16 ) multiplicado por 2 10 ( 1024 ), lo que da 3 * 1024 / 16 o 192 .

El siguiente progtwig confirma esto:

 #include  int main (void) { double d = 0x0.3p10; printf ("%.f\n", d); return 0; } 

La Sección 6.4.4.2 de C99 tiene todos los detalles:

Una constante flotante tiene una parte significativa que puede ser seguida por una parte exponente y un sufijo que especifica su tipo. Los componentes de la parte significativa pueden incluir una secuencia de dígitos que representa la parte de números enteros, seguida de un punto (.), Seguido de una secuencia de dígitos que representa la parte de la fracción.

Los componentes de la parte exponente son e, E, p o P seguidos por un exponente que consiste en una secuencia de dígitos firmada opcionalmente. O bien la parte de número entero o la parte de fracción debe estar presente; para las constantes flotantes decimales, ya sea el período o la parte exponente debe estar presente.

La parte significativa se interpreta como un número racional (decimal o hexadecimal); la secuencia de dígitos en la parte exponente se interpreta como un entero decimal. Para las constantes flotantes decimales, el exponente indica la potencia de 10 por la cual se debe escalar la parte significativa. Para las constantes flotantes hexadecimales, el exponente indica la potencia de 2 por la cual se escalará la parte significativa.

Para constantes flotantes decimales, y también para constantes flotantes hexadecimales cuando FLT_RADIX no es una potencia de 2, el resultado es el valor representable más cercano o el valor representable mayor o menor inmediatamente adyacente al valor representable más cercano, elegido en una implementación definida manera. Para constantes flotantes hexadecimales cuando FLT_RADIX es una potencia de 2, el resultado se redondea correctamente.