commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Luc Maisonobe (JIRA)" <>
Subject [jira] [Commented] (MATH-553) Bug in class# org.apache.commons.math.dfp.Dfp / org.apache.commons.math.linear.RealVectorwith reproducible JUnit test
Date Sun, 03 Apr 2011 20:28:05 GMT


Luc Maisonobe commented on MATH-553:

Test1 one is another strange feature of IEEE754 arithmetic. There are two different encodings
for 0: +0 and -0 (i.e. in IEEE754 standard, the sign of 0 is meaningful). Most of the time,
-0 and +0 cannot be distinguished, and they evaluate as equals (this is the reason why var19.equals(var44)
returns true). However, they do not correspond to the same encoding. -0.0 is encoded as 0x8000000000000000
whereas +0.0 is encoded as 0x0000000000000000 (the most significant bit is the sign bit).
This implies that these values are equal but do not have the same hash code.

In your case, var19 is an array containing { 1, 0, 1 }, it was obtained by raising the same
numbers to the power 100, which did not affect their sign. On the other hand, var44 is an
array containing { 1, -0, 1 }, it was obtained by dividing { -1, 0, -1 } by -1, and this changed
all signs, including the sign of the central 0. Hence both arrays contain equals elements,
but their hash code are different due to the central element.

This behavior is also produced by the following code:
double a = Math.pow(0.0, 100.0);
double b = 0.0 / -1.0;
System.out.println(a == b);
System.out.println("0X" + Long.toHexString(Double.doubleToLongBits(a)));
System.out.println("0X" + Long.toHexString(Double.doubleToLongBits(b)));

which displays:

So test1 is not a bug either.

These two cases are not the only ones to be strange in double arithmetic. There are also encodings
for infinity (plus and minus infinity) and there are subnormal numbers (which are almost like
standard numbers, only with decreasing accuracy as the numbers vanish towards 0).

> Bug in class# org.apache.commons.math.dfp.Dfp / org.apache.commons.math.linear.RealVectorwith
reproducible JUnit test
> ---------------------------------------------------------------------------------------------------------------------
>                 Key: MATH-553
>                 URL:
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 2.2
>         Environment: jdk 1.6
>            Reporter: Sai Zhang
>         Attachments:
> Hi all:
> I am writing an automated bug finding tool, and using
> Apache Commons Math as an experimental subject
> for evaluation.
> The tool creates executable JUnit tests as well as
> explanatory code comments. I attached one bug-revealing
> test as follows. Could you please kindly check it, to
> see if it is a real bug or not?
> Also, it would be tremendous helpful if you could give
> some feedback and suggestion on the quality of generated code comments?
> From the perspective of developers who are familiar with the code,
> is the automatically-inferred comment useful in understanding
> the generated test? is the comment helpful in bug fixing from the
> perspective of developers?
> Particularly when the automatically-generated tests
> are often long.
> Your suggestion will help us improve the tool.
> Please see attachment for the failed test.
> The comment appears in the form of:
> //Tests pass if .... (it gives some small change to the test which can make the failed
test pass)
> For example:
> //Test passes if var10 is: (double)<0
> java.lang.Double var10 = new java.lang.Double(0.0d);
> means if you change var10 to a double value which is < 0 (e.g., -1d), the failed test
will pass

This message is automatically generated by JIRA.
For more information on JIRA, see:

View raw message