出于测试目的:哪些浮点数 (IEEE754 32b) 是 "special"?
For testing purposes: which floating point (IEEE754 32b) numbers are "special"?
我打算更详细地测试跨平台SIMD library。
作为其中的一部分,我想确保我测试了很多浮点数的极端情况以获得一致的行为。
我只能想出几个,比如
- 零和负零,
- 正负无穷大,
- 多个版本的 NaN,
- 非规范化数字
现在,尤其是最后两点让我头疼:我什至不确定我是否理解什么使 (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
在浮点数上编辑。请注意,可能存在模糊系统,其中整数和浮点数的字节顺序不同,在这种情况下,位掩码将不是人们所期望的。
我打算更详细地测试跨平台SIMD library。
作为其中的一部分,我想确保我测试了很多浮点数的极端情况以获得一致的行为。
我只能想出几个,比如
- 零和负零,
- 正负无穷大,
- 多个版本的 NaN,
- 非规范化数字
现在,尤其是最后两点让我头疼:我什至不确定我是否理解什么使 (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
在浮点数上编辑。请注意,可能存在模糊系统,其中整数和浮点数的字节顺序不同,在这种情况下,位掩码将不是人们所期望的。