3

我想编写一个函数来检查或float完全符合 IEEE-754 格式。我是说:doublelong double

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

4

2 回答 2

1

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

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

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

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

于 2013-06-30T00:47:43.807 回答
0

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 位

所以 Intel x86 和 Motorola 68k 中的 80 位格式完全适合双扩展格式。实际上安腾的 82 位浮点型也是兼容类型

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

范围 二进制32 二进制64 二进制128 十进制64 十进制128
p位数≥</td> 32 64 128 22 40
emax ≥</td> 1023 16383 65535 6144 24576

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

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

参考资料和延伸阅读:

于 2021-04-18T14:55:48.070 回答