Двойная точность реализации хэш-кода

Я уже задавал вопрос об этом классе раньше, но вот еще один.

Я ' Мы создали сложный класс:

 public class Complex
 {
        public double Real { get; set; }
        public double Imaginary { get; set; }
 }

И я реализую функции Equals и Hashcode ], а функция Equal учитывает определенную точность. Я использую для этого следующую логику:

    public override bool Equals(object obj)
    {
        //Some default null checkint etc here, the next code is all that matters.
        return Math.Abs(complex.Imaginary - Imaginary) <= 0.00001 &&
            Math.Abs(complex.Real - Real)  <= 0.00001;
    }

Ну, это работает, когда Воображаемая и Реальная части действительно близки друг к другу, это говорит о том, что они одинаковы.

Теперь я пытался реализовать функцию HashCode, я использовал несколько примеров, которые использовал здесь Джон Скит, в настоящее время у меня есть следующие:

    public override int GetHashCode()
    {
        var hash = 17;
        hash = hash*23 + Real.GetHashCode();
        hash = hash*23 + Imaginary.GetHashCode();
        return hash;
    }

Однако это не принимает во внимание определенную точность, которую я хочу использовать. Итак, в основном следующие два класса:

Complex1 [Real = 1.123456; Мнимый = 1,123456]

Комплекс2 [Действительный = 1,123457; Imaginary = 1.123457]

Равны , но не предоставляют одинаковый HashCode , как я могу этого добиться?

5
задан mskfisher 31 May 2012 в 15:49
поделиться