C 浮点数表示法

C 浮点数表示法,c,gcc,floating-point,C,Gcc,Floating Point,我注意到这段代码可以编译,但我不知道为什么: int main() { double z = 0.000000000000001E-383DD; } 但我不确定数字末尾的DD是什么意思。我看过标准,但没有提到这一点 我是通过以下命令获得此号码的: $ gcc -dM -E - < /dev/null #define __DBL_MIN_EXP__ (-1021) #define __FLT_MIN__ 1.17549435e-38F #define __DEC64_DEN__ 0.0

我注意到这段代码可以编译,但我不知道为什么:

int main() {
  double z = 0.000000000000001E-383DD;
}
但我不确定数字末尾的
DD
是什么意思。我看过标准,但没有提到这一点

我是通过以下命令获得此号码的:

$ gcc -dM -E - < /dev/null
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __DEC64_DEN__ 0.000000000000001E-383DD
...
$gcc-dM-E-

这可能是一个GCC扩展吗?

是的,它是一个需要支持的GCC扩展。文本的类型为
\u Decimal64
,但在分配给
double
变量时会进行转换。

右侧表示64位文本

其他扩展后缀:

  • 例如
    1.0i
    1.0j
    1.0fi
    ,等等。这纯粹是一个GCC扩展,标准的C99方式是使用宏
    I
    1.0*I
    1.0f*I
    ,等等)

  • ,这纯粹是一个GCC扩展:

    • 1.0w
      → <代码>\uuu浮点80
      (80位二进制浮点)
    • 1.0q
      → <代码>浮点128(128位二进制浮点)
  • ,其依据是该提案:

    • 1.0df
      → <代码>\u十进制32(32位十进制浮点)
    • 1.0dd
      → <代码>\u十进制64(64位十进制浮点)
    • 1.0dl
      → <代码>\u十进制128(128位十进制浮点)
  • ,其依据是该提案:

    • 0.5hr
      0.5r
      0.5ulr
      等。→ <代码>分形类型(具有幅值的定点类型≤ (一)
    • 5.0hk
      5.0k
      5.0ulk
      等。→ <代码>累计类型(定点类型)

也许它代表64位的密集十进制


看起来它与define的名称匹配,不是吗?

感谢您提供的链接,它们使您更容易理解您的答案。