Как ввести значение с плавающей запятой (двойное) в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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