C中的hex浮点常量

0x0.3p10代表什么值?

在上面的陈述中p是什么意思?

0x0.3p10是在C99中引入的hex浮点0x0.3p10的一个例子。 p将指数中的基数与基数分开。

0x0.3位被称为有效数字部分(整体具有可选分数),指数是被缩放的0x0.3的幂。

这个特定的值是以hex表示为0.3 ,或者是3 * 16 -13/16 )乘以2 101024 ),得出3 * 1024 / 16192

以下程序确认了这一点:

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

C99的6.4.4.2节具有所有的细节:

一个浮点常量有一个有效部分,后面跟随一个指数部分和一个指定其types的后缀。 有效数字部分的组成部分可以包括一个代表整数部分的数字序列,后跟一个句点(。),后面跟着一个代表小数部分的数字序列。

指数部分的组成部分是一个e,E,p或P,随后是一个由任意有符号数字序列组成的指数。 整数部分或小数部分必须存在; 对于十进制浮点常量,周期或指数部分必须存在。

有效部分被解释为(十进制或hex)有理数; 指数部分的数字序列被解释为十进制整数。 对于十进制浮点常量,指数表示有效数字部分将被缩放的功率。 对于hex浮点常量,指数表示有效数字部分将被缩放的2的幂。

当FLT_RADIX不是2的幂时,对于十进制浮点常量和hex浮点常量,结果可能是最接近的可表示值,也可能是紧邻最接近的可表示值的较大或较小的可表示值,在实现定义中select方式。 对于FLT_RADIX是2的幂的hex浮点常量,结果正确舍入。