繁体   English   中英

c 中有多少个浮点类型?

[英]How many floating-point types in c?

许多程序员都知道c中有几种floating-point类型。 到目前为止,我知道floatdoublelong double但我不太确定它们都是,因为我发现了几个定义,比如__DEC32_MAX__ 起初我认为这是__FLT_MAX__的另一个名称,但当我尝试打印它时,我意识到它是不同的(如下所示):

#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__));
}

/* output:
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
*/

什么是__DEC__* s?
还有其他我不知道floating-point类型吗?

在 C23 之前的 C 中只有3 种浮点类型floatdoublelong double ,它们可以使用任意底数作为有效数字,如十进制或八进制,尽管现在它很可能是二进制。 一些较旧的系统使用十六进制浮点类型

C23增加了3 种浮点类型_Decimal32_Decimal64_Decimal128 ,都是十进制类型

如果你看到其他任何东西都是编译器扩展或内部编译器的东西。 这些将以__为前缀,因为以双下划线开头的标识符保留用于实现

一些特定用途需要小的浮点数,例如: float8float16bifloat它主要用于 DSP、AI 和图形应用程序。 许多硬件架构至少支持其中一些(例如 bifloat AVX-512 BF16、ARM-V8.8、AMD ROCm、CUDA 等等)。

还有像 float128 这样的大浮点格式。 示例硬件:PowerPC 中的 VSX。

标准 C 不直接支持这些浮点数。 一些编译器支持它作为扩展。

十进制类型非常特殊,非常有趣,而且非常不标准(还)。 他们使用基于基数 10 的内部分数表示,而不是基数 2。具体参见IEEE 754-2008

因此,所有重要的、不幸的、令人厌烦的 arguments 大约0.1 不能完全表示,大约0.1 + 0.2 不完全等于 0.3 ,go 消失了,几乎奇迹般地,计算机浮点都可以像我们以前使用的十进制浮点一样表现但是这些类型,以及他们需要的printf支持,还不是标准的、流行的或众所周知的。

在 IEEE 754-2008 中,两种主要的十进制类型是decimal32decimal64 ,它们是我们熟悉的二进制floatdouble的十进制对应物。 还有与long double类似的decimal128

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM