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

时间:2013-06-30 00:06:05

标签: c++ floating-point ieee-754 numeric-limits

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

我认为std::numeric_limits<T>::is_iec559与此对应,但它在我的Linux 64位true上为long double返回sizeof(long double) = 16 bytes,但内部编码为{{1}英特尔格式。那怎么办?

2 个答案:

答案 0 :(得分:1)

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

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

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

您需要对std::numeric_limits和实施它的库充满信心。

答案 1 :(得分: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 位格式完全适合双扩展格式。其实Itanium的82位浮点数也是兼容类型

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

<块引用>
<头>
参数 binary32 binary64 binary128 decimal64 decimal128
p 个数字≥ 32 64 128 22 40
emax ≥ 1023 16383 65535 6144 24576

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

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

参考资料和进一步阅读: