Hi!

I rewrote StrictMathTest.java to look like other classes in /test folder (and 
put the test there).

ChangeLog entries:
        * test/Makefile.am: Add java.lang.reflect and java.lang to SUBDIRS.
        * test/java.lang/.cvsignore: New file.
        * test/java.lang/Makefile.am: Likewise.
        * test/java.lang/StrictMathTest.java: Likewise.
        * test/java.lang.reflect/ArrayTest.java: (main(String[])): Comment
        out loadLibrary() call (since this should be done by VMArray
        implementation).


Sat, 24 Jul 2010 12:47:01 +0400 Ivan Maidanski <iv...@mail.ru>:

> 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: application/octet-stream
> StrictMathTest.java

Attachment: classpath-ivmai-40.diff
Description: Binary data

Reply via email to