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

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

我打算更详细地测试跨平台SIMD library

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

我只能想出几个,比如

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

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

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

which floating point (IEEE754 32b) numbers are "special"?

  • zero and negative zero,
  • the positive and negative infinites,
  • multiple versions of NaN,
  • denormalized numbers

差不多就这些了,尽管没有“普通”的 nan。其他可能对测试很重要的数字:无法准确表示所有连续整数的值范围。将产生特殊值的值对。最小(正常)和最大正可表示值。

Is there a way of programmatically generating all these special numbers

有些很容易用 std::numeric_limits 生成。它有安静南、信号南、无穷大、最小正常和非正常的成员函数。

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