Skip to content

the default hash function for floats/doubles is not very good. #538

@nicebyte

Description

@nicebyte

the default hash for floats works by casting the value to size_t:

	template <> struct hash<float>
		{ size_t operator()(float val) const { return static_cast<size_t>(val); } };

this is quite bad because anything that is between two integers gets hashed to the same value. my hash table essentially turned into a linear array because most of the values happened to be in the [0; 1] range.

the same applies to hashes for other floating point types (double, long double etc.).

when fixing this, keep in mind that floating point numbers have two representations for 0 (0 and -0) - those two bit patterns should hash to the same value because they represent the same number.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions