用于测试目的:"special"哪些浮点数(IEEE754 32b)?

For testing purposes: which floating point (IEEE754 32b) numbers are "special"?

本文关键字:浮点数 IEEE754 32b 测试 special 用于      更新时间:2023-10-16

我计划更详细地测试跨平台 SIMD 库。

作为其中的一部分,我想确保我测试了许多浮点数的极端情况,以确保行为一致。

我只能想出一些,比如

  • 和负零,
  • 正负无穷大,
  • 多个版本的 NaN,
  • 非规范化数字

现在,尤其是最后两点让我头疼:我甚至不确定我是否理解使(32b)浮动NaN的二进制表示,更不用说不同类型之间的区别了(似乎有三个,安静,信号和"普通"NaN,但我真的不确定它们是否有自己的表示)。

此外,非规范化数字是指数全零,尾数非零。

有没有办法以编程方式生成所有这些特殊数字(好的,+zero 很容易,只需将 32 位 0-int 解释为浮点数)?我正在开发一个 C(99) 和 C++(11) 库,所以任何一个都可以。

哪个浮点数(IEEE754 32b)是"特殊的"?

  • 和负零,
  • 正负无穷大,
  • 多个版本的 NaN,
  • 非规范化数字

差不多就是这样,虽然没有"普通"的楠。其他可能对测试很重要的数字:所有连续整数都无法准确表示的值范围。将产生特殊值的值对。最小(正常)和最大正可表示值。

有没有办法以编程方式生成所有这些特殊数字

有些很容易用std::numeric_limits生成。它具有静静楠、信号楠、无穷大、最小正态和不正态的成员函数。

其他(例如具有任意有效负载的 nan)可以使用uint32_t生成,其位掩码与 IEEE 规范匹配,可以在浮点上memcpy。请注意,可能存在整数和浮点字节序不同的模糊系统,在这种情况下,位掩码将不是人们所期望的。