Как ввести значение с плавающей запятой (двойное) в std::map?C++

Программы на C++. Форум разработчиков
Anonymous
Как ввести значение с плавающей запятой (двойное) в std::map?

Сообщение Anonymous »

Я унаследовал проект, в котором кто-то ввел числовое значение как двойное в структуру, которая используется в качестве ключа std::map. Значения вводятся человеком и не должны иметь точность более 8 цифр. Каким-то образом, когда значения отправляются нам, к некоторым значениям добавляется некоторый числовой шум, поэтому они немного отличаются от других, т. е. два значения, которые должны быть идентичными, могут отличаться, например, на 2,0e-13, но их следует считать равными для карты.
Есть ли способ, чтобы числа, немного близкие к равным по ключу?
Сначала я закодировал оператор less, чтобы разрешить толерантность:

Код: Выделить всё

if (o1.m_dblval - o2.m_dblval < - factor * std::numeric_limits::epsilon()) {
return true;
}
else if (o1.m_dblval - o2.m_dblval > factor * std::numeric_limits::epsilon())  {
return false;
}

... (continuation of the less implementation)
но это не учитывает транзитивность, т.е. вы можете найти значения a, b и c, где
  • a и b находятся в пределах допуска
  • b и c находятся в пределах допуска
  • но a и c НЕ находятся в пределах допуска
Есть ли более стандартный способ сделать это?
Я мог бы произвольно округлить с более высокой точностью, чем этот коэффициент * эпсилон, возможно, распределить значения по сегментам?>

Подробнее: https://stackoverflow.com/questions/799 ... n-a-stdmap

Вернуться в «C++»