【问题标题】:Why don't the authors of the C99 standard specify a standard for the size of floating point types?为什么 C99 标准的作者不指定浮点类型大小的标准?
【发布时间】:2011-03-27 12:34:17
【问题描述】:

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

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

【问题讨论】:

  • 这个问题stackoverflow.com/questions/271076/… 是关于 C++ 但它适用于 C。它表明即使在 C 中整数类型也没有标准化:标准故意给编译器回旋余地,以便实现可以一样快尽可能。

标签: c floating-point sizeof c99 standardization


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 该标准指定类型的精度,而不是存储该精度级别需要多少位(浮点数可以通过多种不同方式实现)。
    • 该标准没有指定精度,即使是所有浮点数都舍入为 0 的实现也可能符合要求。但是,它确实推荐 IEEE 精度 格式。
    【解决方案3】:

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

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

    【讨论】:

    • 只要您知道精度位数,这是正确的。通常我发现我需要知道这一点才能选择 2 的大幂来加/减以舍入到特定数量的二进制位置..
    【解决方案4】:

    C99 应该以特定的整数大小打破这些障碍。

    不,those fixed-width (u)int<b>N</b>_t types are completely optional,因为并非所有处理器都使用 2 的幂的类型大小。C99 只需要定义 (u)int_fast<b>N</b>_t(u)int_least<b>N</b>_t。这意味着为什么标准与 int 类型相比不一致的前提是完全错误的,因为 int 类型的大小没有一致性

    许多现代 DSP 将 24 位字用于 24 位音频。甚至还有 20 位 DSP,例如 Zoran ZR3800x family28-bit DSPs,例如 ADAU1701,它们允许在不削波的情况下转换 16/24 位音频。许多 32 位或 64 位架构还具有一些奇数大小的寄存器,以允许在不溢出的情况下累积值,例如 TI C5500/C600040-bit longSHARC 与 80 位累加器。 Motorola DSP5600x/3xx series 也有奇怪的大小:2 字节短,3 字节 int,6 字节长。过去有很多带有other word sizes 的架构,比如12、18、36、60 位……还有很多CPUs that use one's complement of sign-magnitude。见Exotic architectures the standards committees care about

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 2011-04-24
      相关资源
      最近更新 更多