You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Cyrille Artho (JIRA)" <ji...@apache.org> on 2014/04/14 08:05:14 UTC
[jira] [Created] (MATH-1118) Complex: semantics of equals != Double
equals, mismatch with hashCode
Cyrille Artho created MATH-1118:
-----------------------------------
Summary: Complex: semantics of equals != Double equals, mismatch with hashCode
Key: MATH-1118
URL: https://issues.apache.org/jira/browse/MATH-1118
Project: Commons Math
Issue Type: Bug
Affects Versions: 3.2
Environment: Mac OS 10.9, Java 6, 7
Reporter: Cyrille Artho
Attachments: Report5.java
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
(v6.2#6252)