commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bill Rossi <b...@rossi.com>
Subject Re: [MATH] generating -0.0 rather than 0.0 when incrementing a negative number
Date Fri, 21 Jan 2011 00:41:15 GMT

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.dunning@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 <sebbaz@gmail.com> wrote:
>>
>>> On 19 January 2011 16:25, Ted Dunning <ted.dunning@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 <sebbaz@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-unsubscribe@commons.apache.org
>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>
>>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

Mime
View raw message