C浮点数表示法
我注意到这段代码编译但我不明白为什么:
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扩展吗?
对,它是一个GCC扩展 ,表示64位十进制浮点文字。
其他扩展名后缀:
-
复杂的文字 ,例如
1.0i
,1.0j
,1.0fi
等。这纯粹的GCC扩展和标准的C99方式是使用宏I
(1.0*I
,1.0f*I
等) -
其他浮点类型 ,纯粹是GCC扩展:
-
1.0w
→__float80
(80位二进制浮点) -
1.0q
→__float128
(128位二进制浮点)
-
-
十进制浮点类型 ,它基于提议N1312:扩展编程语言C以支持十进制浮点运算 :
-
1.0df
→_Decimal32
(32位十进制浮点数) -
1.0dd
→_Decimal64
(64位十进制浮点数) -
1.0dl
→_Decimal128
(128位十进制浮点数)
-
-
定点类型 ,基于提议N1169:支持嵌入式处理器的扩展 :
-
0.5r
,0.5r
,0.5ulr
等→_Fract
类型(幅度≤1的定点类型) -
5.0hk
,5.0k
,5.0ulk
等→_Accum
类型(定点类型)
-
是的,它是支持十进制浮点数的GCC扩展。 文字的类型为_Decimal64
,但在分配给double
变量时会被转换。
也许它代表一个密集的64位十进制?
这个维基百科文章部分看起来与定义的名称相匹配,不是吗?