【问题标题】:boost::unit_test::data::random(-FLT_MAX, FLT_MAX) only generates +Infinityboost::unit_test::data::random(-FLT_MAX, FLT_MAX) 只生成 +Infinity
【发布时间】:2016-09-13 16:03:09
【问题描述】:

我正在使用boost::unit_test::data::random(安装了boost-1.61.0_1)并且在使用boost::unit_test::data::random(-FLT_MAX,FLT_MAX) 生成随机浮点数时遇到了一些问题。它似乎只生成+Infinity

通过反复试验,我发现我可以分别在 [-FLT_MAX,-FLT_MAX * 2^-25)[-FLT_MAX * 2^-25, FLT_MAX) 中生成随机浮点数,这给了我一个可能的解决方法,但我仍然很好奇我做错了什么尝试在[-FLT_MAX, FLT_MAX) 中生成浮点数。

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>
#include <boost/test/data/monomorphic.hpp>
#include <boost/test/data/test_case.hpp>
#include <cfloat>

inline void in_range(float const & min, float const & x, float const & max) {
  BOOST_TEST_REQUIRE(min <= x);
  BOOST_TEST_REQUIRE(x < max);
}

static constexpr float lo{-FLT_MAX / (1024.0 * 1024.0 * 32.0)};

// this test passes
namespace bdata = boost::unit_test::data;
BOOST_DATA_TEST_CASE(low_floats, bdata::random(-FLT_MAX, lo) ^ bdata::xrange(100), x,
                     index) {
#pragma unused(index)
  in_range(-FLT_MAX, x, lo);
}
// this test passes
BOOST_DATA_TEST_CASE(high_floats, bdata::random(lo, FLT_MAX) ^ bdata::xrange(100), x,
                     index) {
#pragma unused(index)
  in_range(lo, x, FLT_MAX);
}
// this test fails
BOOST_DATA_TEST_CASE(all_floats, bdata::random(-FLT_MAX, FLT_MAX) ^ bdata::xrange(100), x,
                     index) {
#pragma unused(index)
  in_range(-FLT_MAX, x, FLT_MAX);
}

结果:

$ ./example
Running 300 test cases...
example.cpp:9: fatal error: in "all_floats": critical check x < max has failed [inf >= 3.40282347e+38]
Failure occurred in a following context:
    x = inf; index = 0; 
...
example.cpp:9: fatal error: in "all_floats": critical check x < max has failed [inf >= 3.40282347e+38]
Failure occurred in a following context:
    x = inf; index = 99; 

*** 100 failures are detected in the test module "example"

【问题讨论】:

    标签: c++ boost random


    【解决方案1】:

    boost::unit_test::data::random 使用std::uniform_real_distribution,它具有requirement

    需要: a ≤ bb - a ≤ numeric_limits&lt;RealType&gt;::max()

    在您的情况下,b - a2 * FLT_MAX,在 float 中是 +Inf

    您可以使用您的解决方法,或者您可以在double 中生成并转换回float

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2021-02-28
      • 2019-04-16
      • 1970-01-01
      • 2014-07-05
      • 2021-06-09
      • 2011-07-10
      • 2011-04-10
      相关资源
      最近更新 更多