Как произвольные значения с плавающей запятой сравниваются с бесконечностью? - PullRequest
6 голосов
/ 13 января 2011

В основном я хочу найти наименьшее (положительное) значение из набора значений и мне нужно значение по умолчанию для сравнения с первым. Наивным предположением было бы, что они всегда сравнивают "меньше чем" (кроме NaN, но давайте не будем их рассматривать), но я не совсем уверен.

Я использую тип 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 ]

9 голосов
/ 13 января 2011

Для поплавков IEEE 754, кроме NaN и бесконечности, все меньше бесконечности. Скорее всего, они будут на вашей платформе. Если вы параноик, проверьте с numeric_limits<float>::is_iec559. Если ваша платформа не соответствует, используйте numeric_limits<float>::max(); если ваша последовательность не пуста, это не даст вам неправильный результат.

2 голосов
/ 13 января 2011

Я поддерживаю комментарий Майкла Мэдсена: вам не нужно бесконечное значение для этого теста,

Сохраните первое значение вашей группы в переменной, а затем начните тестирование со второго значения группы.(и это даже спасет вас от одного теста: P)

0 голосов
/ 13 января 2011

Я думаю, это зависит от того, какое поведение вы ожидаете, если последовательность пуста.Если вы хотите бесконечность, ваша реализация в порядке, в противном случае вам следует использовать первое значение.

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;
  }
}
...