我偶然发现了http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html,其中包括该行
#define TWO5 0x1.0p5 /* 2^5 */
显然, TWO5 被定义为具有显式 value 的 double 1<<5
。但是,这是我第一次看到这种符号。这种格式是如何使用的,与仅仅写作相比有什么优势2.5
?
我偶然发现了http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html,其中包括该行
#define TWO5 0x1.0p5 /* 2^5 */
显然, TWO5 被定义为具有显式 value 的 double 1<<5
。但是,这是我第一次看到这种符号。这种格式是如何使用的,与仅仅写作相比有什么优势2.5
?
这种表示法是在 C99 中引入的。优点是该值以十六进制形式表示,因此当您在基础表示形式和十进制形式之间转换浮点值时,它不会受到舍入等的影响。
有很多页面描述了这种表示法,例如:
http://www.exploringbinary.com/hexadecimal-floating-point-constants/
这是 C99 附带的十六进制浮点表示法(我认为)。优点是它允许用它们精确的可表示值来指定这些常量。(这假设浮点基数是 2、4、8 或 16 :)
这是C99 草案中定义的十六进制浮点常量的语法,写成正则表达式:
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
)。