commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Cyrille Artho (JIRA)" <>
Subject [jira] [Created] (MATH-1118) Complex: semantics of equals != Double equals, mismatch with hashCode
Date Mon, 14 Apr 2014 06:05:14 GMT
Cyrille Artho created MATH-1118:

             Summary: Complex: semantics of equals != Double equals, mismatch with hashCode
                 Key: MATH-1118
             Project: Commons Math
          Issue Type: Bug
    Affects Versions: 3.2
         Environment: Mac OS 10.9, Java 6, 7
            Reporter: Cyrille Artho

Two complex numbers with real/imaginary parts 0.0d but different signs compare as equal numbers.
This is according to their mathematical value; the comparison is done via 

                return (real == c.real) && (imaginary == c.imaginary);

Unfortunately, two Double values do NOT compare as equal in that case, so real.equals(c.real)
would return false if the signs differ.

This becomes a problem because for the hashCode, MathUtils.hash is used on the real and imaginary
parts, which in turn uses Double.hash.

This violates the contract on equals/hashCode, so Complex numbers cannot be used in a hashtable
or similar data structure:

    Complex c1 = new Complex(0.0, 0.0);
    Complex c2 = new Complex(0.0, -0.0);
    // Checks the contract:  equals-hashcode on c1 and c2
    assertTrue("Contract failed: equals-hashcode on c1 and c2", c1.equals(c2) ? c1.hashCode()
== c2.hashCode() : true);

This message was sent by Atlassian JIRA

View raw message