C中的hex浮点常量
0x0.3p10
代表什么值?
在上面的陈述中p
是什么意思?
0x0.3p10
是在C99中引入的hex浮点0x0.3p10
的一个例子。 p
将指数中的基数与基数分开。
0x0.3
位被称为有效数字部分(整体具有可选分数),指数是被缩放的0x0.3
的幂。
这个特定的值是以hex表示为0.3
,或者是3 * 16 -1
( 3/16
)乘以2 10
( 1024
),得出3 * 1024 / 16
或192
。
以下程序确认了这一点:
#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浮点常量,结果正确舍入。