Hello, Andrew!

1. As for .diff extensions - what should be tunable in a browser which app to 
use for opening the file.

2. As for testing for zero sign - I can't agree with you because:
- Sun writes "Floating-point positive zero and floating-point negative zero 
compare as equal, but there are other operations that can distinguish them; for 
example, dividing 1.0 by 0.0 produces positive infinity, but dividing 1.0 by 
-0.0 produces negative infinity." 
(http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html);
- your consideration about the asm code produced for doubleToRawLongBits are 
valid for machines which use the same FP formats as JVM;
- yes it's always better to say what you mean and let the optimizer worry about 
optimization if the latter is capable of doing such things but 
doubleToBits(x)<0 and 1/x<0 are equally far from what I mean (x==-0) in that 
comment.

3. The tests cases class is attached.

Regards.


-----------------
Original message:

On 07/20/2010 07:06 PM, Ivan Maidanski wrote:
> Hello, Andrew!
> 
>> On 06/29/2010 10:22 AM, Ivan Maidanski wrote:
>>> Hi!
>>>
>>> I've fixed a number of bugs in StrictMath class (the RI here is fdlibm of 
>>> some version).
>>>
>>> ChangeLog entries:
>>>
>>>     * java/lang/StrictMath.java:
>>>     (acos(double)): Bug fix for x <= -1/2 case.
>>>     (atan(double)): Fix documentation typo.
>>>     (pow(double,double)): Fix a comment; put y == 1/2 case handling after
>>>     x == -0 case (since pow(-0, 1/2) == 0 but sqrt(-0) == -0); return -0
>>>     (or -INF) for pow(-0, 2*k) where k is non-zero integer; simplify
>>>     expression for "negative" variable.
>>>     (IEEEremainder(double,double)): Bug fix for x == -0 and x == -|y|
>>>     cases; bug fix for |y| >= 2**-1021 and |x| > |y|/2.
>>>     (remPiOver2(double[],double[],int,int)): Reset "recompute" at the
>>>     beginning of every do/while iteration.
>>>     (tan(double,double,boolean)): Negate the result if x <= -0.6744.
>>
>> Hi Ivan,
>>
>> Firstly please attach patches as type text; that way people can read
>> them in their mailers.
> 
> I don't understand. I attach patches with .diff extension. Shall I use .txt?

I think they had a mime-type of application/binary.

>> Can you please send test cases that pass with this patch?
> 
> Ok. I'll write them a bit later... 
> 
>>
>> diff -ru CVS/classpath/java/lang/StrictMath.java 
>> updated/classpath/java/lang/StrictMath.java
>> --- CVS/classpath/java/lang/StrictMath.java  2010-06-29 10:11:06.000000000 
>> +0400
>> +++ updated/classpath/java/lang/StrictMath.java      2010-06-29 
>> 12:51:50.000000000 +0400
>> @@ -1,5 +1,6 @@
>> /* java.lang.StrictMath -- common mathematical functions, strict Java
>> -   Copyright (C) 1998, 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
>> +   Copyright (C) 1998, 2001, 2002, 2003, 2006, 2010
>> +   Free Software Foundation, Inc.
>>
>> This file is part of GNU Classpath.
>>
>> @@ -456,9 +457,10 @@
>>         double r = x - (PI_L / 2 - x * (p / q));
>>         return negative ? PI / 2 + r : PI / 2 - r;
>>       }
>> +    double z = (1 - x) * 0.5;
>>     if (negative) // x<=-0.5.
>>       {
>> -        double z = (1 + x) * 0.5;
>> +        // z = (1+orig_x)*0.5
>>
>> Please don't leave commented lines in code.  If they're wrong, please
>> take them out.
> 
> This is not a commented code - it's a reference C code from fdlibm. It might 
> be better to use some words
instead of a formular like "x is not modified in fdlibm unlike in this 
implementation so we use 1-x (where
x==-orig_x) instead of 1+x".
> 
> 
>>
>> @@ -1554,10 +1553,18 @@
>>             else if (yisint == 1)
>>               ax = -ax;
>>           }
>> +        else
>> +          {
>> +            // Check for x == -0 with odd y.
>> +            if (1 / x < 0
>>
>> Why use "1 / x < 0" ?
> 

> What's else to use? The alternative is Double.doubleToRawLongBits(x)
> < 0 but (1/x)<0 is cheaper (recall that |x| is zero).

In

class T
{
  boolean foo(double x)
  {
    return Double.doubleToRawLongBits(x) < 0;
  }

  boolean bar(double x)
  {
    return (1/x) < 0;
  }
}

gcj gives you

T.foo(double)boolean:
        movsd   %xmm0, -16(%rsp)
        movq    -16(%rsp), %rax
        shrq    $63, %rax
        ret

for the first, and

T.bar(double)boolean:
        movsd   .LC0(%rip), %xmm1
        divsd   %xmm0, %xmm1
        movapd  %xmm1, %xmm0
        xorpd   %xmm1, %xmm1
        ucomisd %xmm0, %xmm1
        seta    %al
        ret

for the second.  Any JIT might do something similar.

IMO it's always better to say what you mean and let the optimizer
worry about optimization.

Andrew.


Attachment: StrictMathTest.java
Description: Binary data

Reply via email to