[EMAIL PROTECTED] a écrit :
> Author: luc
> Date: Fri Aug 29 08:46:22 2008
> New Revision: 690308
> 
> URL: http://svn.apache.org/viewvc?rev=690308&view=rev
> Log:
> Changed the Complex.equals() method so that it considers +0 and -0 are equal,
> as required by IEEE-754 standard.
> JIRA: MATH-221

The fix below for issue https://issues.apache.org/jira/browse/MATH-221
is based on the following behavior:

In IEEE-754, zero is a signed value, i.e. there are both a +0 and a -0
numbers, each with its own specific representation. The IEEE-754
standard includes a rule saying these two numbers should always compare
as equal. This is directly implemented in all processors and in the JVM
when using the equality operator == on native doubles. However, we did
not use these operator on the native doubles but on the long
representation of such doubles returned by the
Double.doubleToRawLongBits() method. Since the two representations are
different (the sign bit is flipped), we considered -0 and +0 where not
the same number.

I think using Double.doubleToRawLongBits() comes from the special cases
handling for NaN, because as documented in the Complex.equals() javadoc,
we consider all NaN values to be equal (which is *not* what IEEE-754
says). I understand the rationale for NaN in this class, but once this
special case has been handled, I think relying on the native double ==
operator is better as it handles such weird cases as +/-0 better.

We did the same trick for RealMatrixImpl, and I copied this trick also
when implementing RealVectorImpl and Vector3D. I will remove it from all
three classes now.

Luc


> 
> Modified:
>     
> commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/complex/Complex.java
>     commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml
>     
> commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/complex/ComplexTest.java
> 
> Modified: 
> commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/complex/Complex.java
> URL: 
> http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/complex/Complex.java?rev=690308&r1=690307&r2=690308&view=diff
> ==============================================================================
> --- 
> commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/complex/Complex.java
>  (original)
> +++ 
> commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/complex/Complex.java
>  Fri Aug 29 08:46:22 2008
> @@ -255,10 +255,7 @@
>                  if (rhs.isNaN()) {
>                      ret = this.isNaN();
>                  } else {
> -                ret = (Double.doubleToRawLongBits(real) ==
> -                        Double.doubleToRawLongBits(rhs.getReal())) &&
> -                    (Double.doubleToRawLongBits(imaginary) ==
> -                        Double.doubleToRawLongBits(rhs.getImaginary())); 
> +                    ret = (real == rhs.real) && (imaginary == 
> rhs.imaginary); 
>                  }
>              } catch (ClassCastException ex) {
>                  // ignore exception
> 
> Modified: commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml
> URL: 
> http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml?rev=690308&r1=690307&r2=690308&view=diff
> ==============================================================================
> --- commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml (original)
> +++ commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml Fri Aug 
> 29 08:46:22 2008
> @@ -39,6 +39,10 @@
>    </properties>
>    <body>
>      <release version="2.0" date="TBD" description="TBD">
> +      <action dev="luc" type="fix" issue="MATH-221" due-to="Dieter Roth">
> +        Changed the Complex.equals() method so that it considers +0 and -0 
> are equal,
> +        as required by IEEE-754 standard.
> +      </action>
>        <action dev="luc" type="add" issue="MATH-220" >
>          Added JAMA-like interfaces for decomposition algorithms. These 
> interfaces
>          decompose a matrix as a product of several other matrices with 
> predefined
> 
> Modified: 
> commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/complex/ComplexTest.java
> URL: 
> http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/complex/ComplexTest.java?rev=690308&r1=690307&r2=690308&view=diff
> ==============================================================================
> --- 
> commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/complex/ComplexTest.java
>  (original)
> +++ 
> commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/complex/ComplexTest.java
>  Fri Aug 29 08:46:22 2008
> @@ -690,4 +690,10 @@
>      public void testTanhCritical() {
>          TestUtils.assertSame(nanInf, new Complex(0, pi/2).tanh());
>      }
> +
> +    /** test issue MATH-221 */
> +    public void testMath221() {
> +        assertEquals(new Complex(0,-1), new Complex(0,1).multiply(new 
> Complex(-1,0)));
> +    }
> +
>  }
> 
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to