5

我偶然发现了http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html,其中包括该行

#define  TWO5      0x1.0p5      /* 2^5     */

显然, TWO5 被定义为具有显式 value 的 double 1<<5。但是,这是我第一次看到这种符号。这种格式是如何使用的,与仅仅写作相比有什么优势2.5

4

3 回答 3

6

这种表示法是在 C99 中引入的。优点是该值以十六进制形式表示,因此当您在基础表示形式和十进制形式之间转换浮点值时,它不会受到舍入等的影响。

有很多页面描述了这种表示法,例如:

http://www.exploringbinary.com/hexadecimal-floating-point-constants/

于 2013-02-06T12:21:55.947 回答
3

这是 C99 附带的十六进制浮点表示法(我认为)。优点是它允许用它们精确的可表示值来指定这些常量。(这假设浮点基数是 2、4、8 或 16 :)

于 2013-02-06T12:21:55.083 回答
2

这是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,doublelong double)。

于 2013-02-06T12:40:25.040 回答