基本上我想从一堆值中搜索最小(正)值,并需要一个默认值来与第一个值进行比较。天真的假设是,他们总是比较“小于”(除了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;
}
}
答案 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;
}
}