【问题标题】:Function that returns whether the floating-point type is fully compliant to IEEE-754?返回浮点类型是否完全符合 IEEE-754 的函数?
【发布时间】:2013-06-27 11:23:27
【问题描述】:

我想编写一个函数来检查 floatdoublelong double 是否完全符合 IEEE-754 格式。我的意思是:

我认为 std::numeric_limits<T>::is_iec559 与此相对应,但它在我的 64 位 Linux 上为 long double 返回 true,其中 sizeof(long double) = 16 bytes 但内部编码为 80-bit Intel 格式。那么该怎么做呢?

【问题讨论】:

  • 80 位 Intel 格式符合 IEEE-754 的格式(具体来说,它满足第 3.7 节中定义的“binary64 扩展”格式的要求)。我认为您需要一个谓词来指定格式是否为 IEEE-754“基本格式”(或可能是“交换格式”);这比is_iec559 声称的要求要具体得多。
  • 由于内存对齐要求,我经常看到 sizeof(long double) 在 x86_32 上为 12 个字节,在 x86_64 GNU G++ 上为 16 个字节。

标签: c++ floating-point ieee-754 standards-compliance extended-precision


【解决方案1】:

如果std::numeric_limits<T>::is_iec559 为真,则T 符合标准。

如果系统使用 80 位作为其内部寄存器,只要最终舍入结果最接近使用无限位数的参考结果,就可以了。也就是说,添加或删除一个 ulp 将使您远离参考。

很难通过对所有可表示的数字运行所有可能的操作并与使用许多位的引用进行比较来检查这一点。

您需要对 std::numeric_limits 和实现它的库有信心。

【讨论】:

    【解决方案2】:

    80 位 long double 实际上符合 IEEE 754,因为它属于“扩展格式”类别

    IEEE 754 浮点标准建议实现提供扩展精度格式。该标准规定了扩展格式的最低要求,但没有规定编码。编码是实现者的选择。

    https://en.wikipedia.org/wiki/Extended_precision#IEEE_754_extended_precision_formats

    IEEE 754-1985中除了常见的单双精度外,还定义了2种对应的扩展格式:

    • 单扩展精度:大小 ⩾ 43 位,有效位 ⩾ 32 位,指数 ⩾ 11 位
    • 双扩展精度:大小 ⩾ 79 位,有效位 ⩾ 64 位,指数 ⩾ 15 位

    因此,英特尔 x86 和摩托罗拉 68k 中的 80 位格式完全适合双扩展格式。其实安腾的82位float也是兼容类型

    IEEE 754-2008 重命名单精度和双精度格式并添加更多类型,但基本要求看起来相同,扩展类型的指数大小等于下一个类型(如果可用)

    Parameter binary32 binary64 binary128 decimal64 decimal128
    p digits ≥ 32 64 128 22 40
    emax ≥ 1023 16383 65535 6144 24576

    注意 1 — 对于扩展格式,最小指数范围是下一个更广泛的基本格式(如果有的话),而最小精度介于给定基本格式和下一个更广泛的基本格式之间。

    https://irem.univ-reunion.fr/IMG/pdf/ieee-754-2008.pdf

    参考和延伸阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-17
      • 2012-01-06
      • 2014-10-18
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多