C语言浮点类型数量、__DEC*系列标识含义及未知类型咨询
你看到的__DEC32_MAX__、__DEC64_MAX__、__DEC128_MAX__是C99标准引入的十进制浮点类型的最大值宏,分别对应_Decimal32、_Decimal64、_Decimal128这三种十进制浮点类型。
这类类型和我们熟悉的float、double、long double(二进制浮点类型)是并行的独立类型,核心区别在于:二进制浮点用二进制表示小数,会存在十进制小数(比如0.1)无法精确存储的问题;而十进制浮点直接以十进制编码存储,能精准表示十进制小数,适合金融、货币计算等对十进制精度敏感的场景。
从你给出的测试代码和输出也能看出,虽然_Decimal32和float的存储大小都是4字节,_Decimal64和double都是8字节,但它们的最大值、数值范围完全不同,这也印证了它们不是别名,而是独立类型。
其他你可能不了解的浮点类型
除了标准C规定的二进制浮点(float、double、long double)和十进制浮点(_Decimal32、_Decimal64、_Decimal128),还有一些编译器扩展的浮点类型:
__float128:GCC、Clang等编译器支持的128位二进制浮点类型,部分平台上long double可能等价于它,但在x86平台上long double通常是80位扩展精度,和__float128不同。__fp16:半精度浮点类型(16位),常见于嵌入式、GPU等场景,部分编译器支持。- 部分嵌入式编译器还会提供针对特定硬件的自定义浮点类型,但这些都不属于标准C范畴,兼容性较差。
附你提供的测试代码:
#include <stdio.h> void main(void) { __mingw_printf("flt value: %e, size: %d\n", __FLT_MAX__, sizeof(__FLT_MAX__)); __mingw_printf("dbl value: %e, size: %d\n", __DBL_MAX__, sizeof(__DBL_MAX__)); __mingw_printf("ldbl value: %e, size: %d\n", __LDBL_MAX__, sizeof(__LDBL_MAX__)); __mingw_printf("dec32 value: %e, size: %d\n", __DEC32_MAX__, sizeof(__DEC32_MAX__)); __mingw_printf("dec64 value: %e, size: %d\n", __DEC64_MAX__, sizeof(__DEC64_MAX__)); __mingw_printf("dec128 value: %e, size: %d\n", __DEC128_MAX__, sizeof(__DEC128_MAX__)); }
输出结果:
flt value: 3.402823e+038, size: 4
dbl value: 1.797693e+308, size: 8
ldbl value: 3.237664e-317, size: 16
dec32 value: 9.944455e-315, size: 4
dec64 value: 9.089022e+269, size: 8
dec128 value: 3.237656e-317, size: 16
内容的提问来源于stack exchange,提问作者Jenny

