函数,返回浮点类型是否完全符合IEEE-754

Function that returns whether the floating-point type is fully compliant to IEEE-754?

本文关键字:是否 完全符合 IEEE-754 类型 返回 函数      更新时间:2023-10-16

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

  • float=IEEE-754二进制32
  • double=IEEE-754二进制64
  • 长双=IEEE-754二进制128

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

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

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

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

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

80位long double实际上符合IEEE 754;"扩展格式";类别

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

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

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

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

因此,英特尔x86和摩托罗拉68k中的80位格式完全符合双扩展格式。事实上,安腾的82位浮点也是一种兼容类型的

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

参数 二进制32 二进制64 二进制128 小数64 小数128
p位数字≥ 32 64 128 22 40
emax≥ 1023 16383 65535 6144 24576