Alex Herbert created NUMBERS-201:
------------------------------------

             Summary: FP64 equals is not consistent with hashCode
                 Key: NUMBERS-201
                 URL: https://issues.apache.org/jira/browse/NUMBERS-201
             Project: Commons Numbers
          Issue Type: Bug
          Components: field
    Affects Versions: 1.1
            Reporter: Alex Herbert


The FP64 class wraps a {{double}} so that it can be used as a field. The 
implementation of {{equals}} uses Precision with an allowed difference of up to 
2 ULP:
{code:java}
public boolean equals(Object other) {
    if (other instanceof FP64) {
        final FP64 o = (FP64) other;
        return Precision.equals(value, o.value, 1);
    }
    return false;
}{code}
The hashCode is generated using Double.hashCode(value).

The result is that two objects that are equal can generate a different hash 
code. This breaks the contract of Object.equals where two objects that are 
equal have the same hash code.

Possible fixes:
 # Use the equivalent of (({{{}Double)value).equals(o.value){}}} for a binary 
equality check between values that is consistent with double.
 # Document the class as having an equals method that is not consistent with 
hash code. 

I do not understand the requirement for using Precision. If a user has their 
own tolerance for field equivalence then this should be left to them to set the 
threshold. So I would recommend option 1.

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to