任意浮点值如何与无穷大相比较?

时间:2011-01-13 00:31:32

标签: c++ c++11 floating-point

基本上我想从一堆值中搜索最小(正)值,并需要一个默认值来与第一个值进行比较。天真的假设是,他们总是比较“小于”(除了NaNs,但我们不考虑那些),但我不太确定。

我正在使用float类型,我认为可以安全地假设我的目标硬件实现了无穷大值。

以下是一些示例代码:

auto leastValue = std::numeric_limits<float>::infinity();
for (auto i = something.begin(), e = something.end(); i != e; ++i)
{
  auto value = (*i)->GetValue();
  if (value < leastValue)
  {
    leastValue = value;
  }
}

3 个答案:

答案 0 :(得分:9)

对于IEEE 754浮点数,除了NaN和无穷大,一切都小于无穷大。你有可能在你的平台上有那些。如果你是偏执狂,请查看numeric_limits<float>::is_iec559。如果您的平台碰巧不符合要求,请使用numeric_limits<float>::max();如果你的序列是非空的,它不会给你一个错误的结果。

答案 1 :(得分:2)

我支持Michael Madsen评论:此测试不需要无限值,

将您群中的第一个值存储在变量中,然后使用该群的第二个值开始测试。 (它甚至会为你节省一次测试:P)

答案 2 :(得分:0)

我认为这取决于序列为空时您期望的行为。如果你想要无限,你的实现就可以了,否则你应该使用第一个值。

auto i = something.begin();
auto e = semething.end();
if (i == e)
  throw std::exception("empty sequence");

auto leastValue = (*i)->GetValue();

for (++i; i != e; ++i)
{
  auto value = (*i)->GetValue();
  if (value < leastValue)
  {
    leastValue = value;
  }
}