С вами может быть все в порядке, если вы уверены, что намереваетесь посчитать количество экземпляров точного значения с плавающей запятой.
Как говорит Дэвид, неотъемлемая проблема хеш-таблицы с ключами в числах с плавающей точкой заключается в том, что в хеш-таблицах используется равенство для идентификации ключей, а равенство с плавающей точкой является несколько ненадежным понятием из-за ошибок вычислений. Нет общей гарантии, что sin(pi / 6) == 0.5
или даже (2.0 / 3) * (2.0 / 3) == (4.0 / 9)
. В обоих случаях LHS может немного отличаться от RHS.
Итак, если некоторые из подсчитываемых вами записей вводятся как 0.5
, а некоторые вычисляются как sin(pi / 6)
, и вы хотите, чтобы они были посчитаны вместе, то вам нужно сделать больше, чем просто хешировать значение с плавающей запятой.
Вам может сойти с рук округление, а затем хэширование, хотя вы никогда не избежите проблемы полностью. Например, если вы округлите до ближайшего 0,001, то вы идентифицируете 0.2020001 и 0.2020003 как «одно и то же значение с ошибкой вычисления», но не одинаково близкие 0.1014999 и 0.1015001. Я использовал примеры из 10 для простоты ввода, но, конечно, «float» обычно означает двоичное представление.
Точно такая же проблема применима к двоичному дереву. Hashtables на самом деле не волнует, что их ключевые данные «есть», они просто заботятся о том, чтобы кто-то мог предоставить функцию h
, которая сопоставляет ключи с целыми числами, так что для любых x
и y
вы хотите считать «равными» h(x) == h(y)
. Затем, для производительности, вы хотите, чтобы h
вводил не больше «коллизий» (экземпляров h(x) == h(y)
, где x != y
), чем случайный шанс. Нет никаких препятствий для того, чтобы делать это с поплавками. Вы должны убедиться, что вы не включили в хеш ничего, что не участвует в сравнении, и это поможет, если вы включите всю информацию, которая участвует в сравнении.
Если вы сможете решить вопрос о том, что вы на самом деле рассчитываете, то это может привести вас к структуре данных, которая вам нужна. Если вы хотите, чтобы в совпадениях был допуск, вам лучше всего отсортировать все числа с плавающей точкой, а затем искать кластеры значений.