【发布时间】:2019-07-03 18:14:12
【问题描述】:
我正在为数学函数编写单元测试,我希望能够“遍历”所有可能的浮点数/双精度数。
由于 IEEE 的恶作剧,浮点类型不能在其末端递增 (++)。有关详细信息,请参阅this question。该答案指出:
一个只能加2^(n-N)的倍数
但从未提及n 是什么小东西。
在这个伟大的blog post 中给出了将所有可能的值从 +0.0 迭代到 +infinity 的解决方案。该技术涉及使用带有int 的联合来遍历float 的不同值。这是由于帖子中解释了以下属性,尽管它们仅对正数有效。
- 相邻的浮点数具有相邻的整数表示
- 递增浮点数的整数表示会移动到下一个可表示的浮点数,远离零
他对 +0.0 到 +infinity 的解决方案(0.f 到 std::numeric_limits<float>::max()):
union Float_t {
int32_t RawExponent() const { return (i >> 23) & 0xFF; }
int32_t i;
float f;
};
Float_t allFloats;
allFloats.f = 0.0f;
while (allFloats.RawExponent() < 255) {
allFloats.i += 1;
}
-infinity 到 +0.0(std::numeric_limits<float>::lowest() 到 0.f)是否有解决方案?
我已经测试了std::nextafter and std::nexttoward,但无法让它们工作。也许这是一个 MSVC 问题?
我可以接受任何形式的 hack,因为这是一个单元测试。谢谢!
【问题讨论】:
-
nextafter是标准的高级方法,可以完全按照您的意愿行事。有什么不好的地方? -
@PascalCuoq 它不会增加值。我将添加一个我正在做的示例,1 秒。
-
@PascalCuoq 你是对的,nextafter 工作......我想我在其他地方有一个错误。谢谢!请随意将您的评论作为答案,我会将其标记为正确答案。
-
即使您可以遍历所有 64 位双精度值,您的程序也不会在您的生命周期内完成。
-
更好的开始! XD 我想我会写一个随机模糊器。欢呼
标签: c++ math floating-point numeric floating-accuracy