![](/img/trans.png)
[英]How do I handle byte order differences when reading/writing floating-point types in C?
[英]How many floating-point types in c?
许多程序员都知道c
中有几种floating-point
类型。 到目前为止,我知道float
, double
和long 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
类型吗?
一些特定用途需要小的浮点数,例如: float8
和float16
和bifloat
它主要用于 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 中,两种主要的十进制类型是decimal32
和decimal64
,它们是我们熟悉的二进制float
和double
的十进制对应物。 还有与long double
类似的decimal128
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.