我偶然发现http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html,其中包含
行#define TWO5 0x1.0p5 /* 2^5 */
显然,TWO5被定义为带有显式值1<<5
的双精度型。但是,这是我第一次看到这种表示法。这种格式是如何使用的,与仅编写2.5
相比有什么优势?
答案 0 :(得分:6)
这种表示法是在C99中引入的。优点是该值以十六进制形式表示,因此当您在基础表示和小数形式之间转换浮点值时,它不会发生舍入等。
有很多页面描述了这种表示法,例如:
http://www.exploringbinary.com/hexadecimal-floating-point-constants/
答案 1 :(得分:3)
这是C99附带的十六进制浮点符号(我认为)。优点是它允许以其精确可表示的值指定这样的常量。 (这假设浮点基数是2,4,8或16 :)
答案 2 :(得分:2)
这是十六进制浮点常量的语法,如C99 draft中所定义,写为正则表达式:
0[xX]([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?)[pP][+-]?[0-9]+[flFL]?
其中包括4个部分:
0[xX]
:十六进制前缀,这两个中的任何一个:
0x 0X
([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?)
:十六进制小数常量,例如:
34.2f .de b3.
或十六进制数字序列(十六进制的整数),例如:
2f4 10
第二部分基本上描述了尾数。
[pP][+-]?[0-9]+
:二进制指数部分(以十进制指定),例如:
p-4 p20
我们通过以十六进制指定尾数来指定十六进制浮点常量,并以十进制指定指数b(对于基数2)。
[flFL]?
:可选的浮动后缀,用于指明类型(float
,double
或long double
)。