明确地用base和exponent定义浮点值

时间:2013-02-06 12:18:21

标签: c floating-point notation

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

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

显然,TWO5被定义为带有显式值1<<5的双精度型。但是,这是我第一次看到这种表示法。这种格式是如何使用的,与仅编写2.5相比有什么优势?

3 个答案:

答案 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]?:可选的浮动后缀,用于指明类型(floatdoublelong double)。