I think having an explicit special case might be the best way to solve this, in terms of performance. The test can be put inside the existing if block so you only pay the price of the comparison when rounding up.



On Wed, 19 Jan 2011, sebb wrote:

On 19 January 2011 18:28, Ted Dunning <ted.dunn...@gmail.com> wrote:
No.  Indeed not.  And if it calls floor then it isn't likely to give the
desired -0 result.

How important is it to return -0 instead of +0 anyway?

It can mess up comparisons of Doubles:

   public static void main(String z[]){
       Double nz = -0.0;
       Double n = -0.49;
       System.out.println("nz.compare(n)
"+Double.compare(nz,n)+"\nDouble.compare(rint(nz),rint(n))
"+Double.compare(rint(nz),rint(n)));
   }

produces

nz.compare(n) 1
Double.compare(rint(nz),rint(n)) -1

i.e.

nz > n yet rint(nz) < rint(n)

This is counter-intuitive.

On Wed, Jan 19, 2011 at 10:17 AM, sebb <seb...@gmail.com> wrote:

On 19 January 2011 16:25, Ted Dunning <ted.dunn...@gmail.com> wrote:
Slightly slower,

Unfortunately, I suspect it is about twice as slow for this case,
because FastMath.ceil() actually calls FastMath.floor().

Not ideal for FastMath !


   double y = floor(x):
   double d = x - y;
   if (d > 0.5) {
        return ceil(x);
   } else {
        return y;
   }

but it gives your desired result with little (visible) special casing.

On Wed, Jan 19, 2011 at 8:04 AM, sebb <seb...@gmail.com> wrote:

FastMath.rint(x) has the following code:

       double y = floor(x);
       double d = x - y;

       if (d > 0.5) {
           return y+1.0; // round up
       }
 ...

For -0.5 < x < 0 the rounding up generates +0.0  - rather than -0.0,
as expected by the sign of the input parameter.

Is there an easy way to fix this, other than explicitly checking for y
==
-1.0?

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to