函数,返回浮点类型是否完全符合IEEE-754
Function that returns whether the floating-point type is fully compliant to IEEE-754?
我想写一个函数来检查float
、double
或long 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
- 如何找到大小'x'数组是否完全填充,在C++?
- Visual Studio 2019 v16.3.9 是否完全支持 C++20?
- POD类型是否完全等同于琐碎的标准布局类型
- 如何知道请求是否完全使用 TCP 套接字接收?
- 如何检查 CNG Windows API 是否返回符合 FIPS 的算法实现
- 是否有符合标准的方法来确定非静态杆件的对齐方式?
- 比较BGR图像是否完全相同
- 是否使用符合标准的线程池进行 std::async 的 Visual C++ 实现
- VS2017 中是否完全支持折叠表达式
- Arduino是否完全支持C++标准库
- 如何检测 W2A 转换是否完全成功
- 这种编译器优化不一致是否完全由未定义的行为来解释
- 有效地检查文本文件是否完全由空格c++组成
- 两次声明纯虚拟函数(在层次结构中的两个类中)是否完全合法
- 以下类型的声明是否完全有效
- 函数,返回浮点类型是否完全符合IEEE-754
- 三次方贝塞尔曲线是否完全包含在控制点的边界框中?
- 我是否完全否定了Microsoft::WRL::ComPtr作为引用传递的好处(&) ?
- 是否有一种完全符合标准的方法来使编译器将文件的确切(二进制)内容粘贴到源文件中
- 标准遵从性——是否有完全符合标准的c++实现