我想编写一个函数来检查float
,double
或long double
是否完全符合IEEE-754格式。我的意思是:
我认为std::numeric_limits<T>::is_iec559
与此对应,但它在我的Linux 64位true
上为long double
返回sizeof(long double) = 16 bytes
,但内部编码为{{1}英特尔格式。那怎么办?
答案 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种对应的扩展格式:
因此,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