我想编写一个函数来检查 float
, double
或 long double
是否完全符合IEEE-754格式 . 我的意思是:
-
float = IEEE-754 binary32
-
double = IEEE-754 binary64
-
long double = IEEE-754 binary128
我认为 std::numeric_limits<T>::is_iec559
对应于此,但它在我的Linux 64位上返回 true
long double
,其中 sizeof(long double) = 16 bytes
但内部以 80-bit
英特尔格式编码 . 那怎么办呢?
1 回答
如果
std::numeric_limits<T>::is_iec559
为真,则T
遵守标准 .如果系统使用80位作为其内部寄存器,只要最终舍入结果最接近使用无限位数的参考结果,这就没问题 . 也就是说,添加或删除一个ulp将使您远离引用 .
通过使用所有可表示的数字运行所有可能的操作并与使用多位的引用进行比较,很难检查这一点 .
您需要对
std::numeric_limits
和实现它的库有信心 .