繁体   English   中英

为什么 C99 标准的作者不为浮点类型的大小指定一个标准?

[英]Why don't the authors of the C99 standard specify a standard for the size of floating point types?

我注意到在 Windows 和 Linux x86 上,float 是 4 字节类型,double 是 8,但是 long double 在 x86 和 x86_64 上分别是 12 和 16。 C99 应该打破这些具有特定整体尺寸的障碍。

最初的技术限制似乎是由于 x86 处理器无法处理超过 80 位的浮点运算(加上 2 个字节来四舍五入),但为什么与 int 类型相比标准不一致? 他们为什么不至少进行 80 位标准化?

C 语言没有指定各种类型的实现,因此它可以在尽可能广泛的硬件上有效实现。

这也扩展到整数类型 - C 标准整数类型具有最小范围(例如, signed char是 -127 到 127, shortint都是 -32,767 到 32,767, long是 -2,147,483,647 到 2,147,483,647,而long long是 -9,2203,7875到 9,223,372,036,854,775,807)。 对于几乎所有目的,这就是程序员需要知道的全部内容。

C99 确实提供“固定宽度”整数类型,如int32_t - 但这些是可选的- 如果实现不能有效地提供这种类型,它不必提供它。

对于浮点类型,存在等效限制(例如, double必须具有至少 10 位十进制数字的精度)。

他们试图(主要)适应预先存在的 C 实现,其中一些甚至不使用 IEEE 浮点格式。

int s 可用于表示抽象事物,如 id、颜色、错误代码、请求等。在这种情况下, int s 不是真正用作整数,而是用作位集(= 容器)。 大多数情况下,程序员确切地知道他需要多少位,因此他希望能够根据需要使用尽可能多的位。

另一方面, float是为非常特定的用途(浮点运算)而设计的。 您不太可能能够精确地确定您的float需要多少位。 实际上,大多数情况下,您拥有的位越多越好。

C99 应该打破这些具有特定整体尺寸的障碍。

不,那些固定宽度的(u)int N _t类型是完全可选的,因为并非所有处理器都使用 2 的幂的类型大小。 C99 只要求定义(u)int_fast N _t(u)int_least N _t . 这意味着为什么标准与 int 类型不一致的前提是完全错误的,因为 int 类型的大小没有一致性

许多现代 DSP 将 24 位字用于 24 位音频。 甚至还有像卓然 ZR3800x 系列这样的 20 位 DSP 或像ADAU1701这样的28 位 DSP ,它允许在不削波的情况下转换16/24位音频。 许多 32 位或 64 位架构还具有一些奇数大小的寄存器,以允许在不溢出的情况下累加值,例如,具有40 位long的 TI C5500 / C6000和具有 80 位累加器的SHARC Motorola DSP5600x/3xx 系列也有奇数大小:2 字节短、3 字节整数、6 字节长。 过去,有很多架构具有其他字长,例如 12、18、36、60 位……以及许多使用符号大小补码的 CPU 查看标准委员会关心的异国架构

C 旨在灵活地支持各种此类平台。 指定固定大小,无论是整数类型还是浮点类型,都违背了这一目的。 硬件中的浮点支持变化很大,就像整数支持一样。 有使用十进制、十六进制或其他可能的基数的不同格式。 每种格式都有不同大小的指数/尾数,不同的符号/指数/尾数位置,甚至有符号格式。 例如,有些对尾数使用二进制补码,而有些则对指数或整个浮点值使用二进制补码。 您可以在这里看到许多格式但这显然不是曾经​​存在的所有格式。 例如,上面的 SHARC 有一个特殊的 40 位浮点格式。 一些平台还对long double使用double-double 算法 也可以看看

这意味着您无法为所有平台标准化单一浮点格式,因为没有一刀切的解决方案。 如果您正在设计 DSP,那么显然您需要一种最适合您目的的格式,以便您可以搅动尽可能多的数据。 当 40 位格式对您的应用程序具有足够的精度、更适合缓存并且需要的管芯尺寸要小得多时,就没有理由使用 IEEE-754 binary64。 或者,如果您使用的是小型嵌入式系统,那么 80 位long double精度通常是无用的,因为您甚至没有足够的 ROM 来容纳 80 位long double精度库。 这就是为什么有些平台将long double限制为 64 位,如double

暂无
暂无

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

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