LINUX.ORG.RU

Поиск в map<double>, может ли быть не нахождение того же значения, что добавили?

 


2

1

Возможна ли ситуация, что такая функция вернет истину?

bool to_do_test(double v) {
   map<double,double> m;
   m.insert({v,v});
   return m.find(v) == m.end();
}
Т.е. возможны ли ситуации изменения double при множественных операциях копирования и сохранения в контейнерах через десятки классов, без математических операций?

Ответ на: комментарий от rumgot

Знатоки, как вам такой способ сравнения double :?

Там все сложно.

https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon

template<class T>
typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type
    almost_equal(T x, T y, int ulp)
{
    // the machine epsilon has to be scaled to the magnitude of the values used
    // and multiplied by the desired precision in ULPs (units in the last place)
    return std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp
        // unless the result is subnormal
        || std::abs(x-y) < std::numeric_limits<T>::min();
}
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Там все сложно.
https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon
// and multiplied by the desired precision in ULPs (units in the last place)

Кстати, может мне кто объяснить, каков смысл в этом примере ULP - желаемая точность? В примере по ссылке используется 2, почему не 1?. Для каких случаев нужно ставить 2 или более?

victor79
() автор топика
Ответ на: комментарий от KennyMinigun

almost_equal(T x, T y, int ulp)
return std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp || std::abs(x-y) < std::numeric_limits<T>::min()

Жуть: almost_equal(x, 0, 1) всегда будет ложью, пока порядок цифр аргумента x не станет меньше std::numeric_limits<T>::min(), что в свою очередь около 1e-300 для double.

Потому что при x <= epsilon, (x+0) <= esilon, а произведение двух epsilon будет всегда меньше чем epsilon.

victor79
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.