RFR 8015978: Incorrect transformation of XPath expression "string(-0)"

Joe Darcy joe.darcy at oracle.com
Fri Jun 14 04:54:00 UTC 2013


Hi Aleksej,

Source changes look fine; thanks,

-Joe

On 6/13/2013 7:10 AM, Aleksej Efimov wrote:
> Joe,
> I have added the call to '!Double.isFinite(d)', the '-0.0' to '+0.0' 
> conversion still there.
> new webrev: http://cr.openjdk.java.net/~coffeys/webrev.8015978.v3/ 
> <http://cr.openjdk.java.net/%7Ecoffeys/webrev.8015978.v3/>
>
> Regards,
> Aleksej
>
> On 06/10/2013 08:30 PM, Joe Darcy wrote:
>> Hi Aleksej,
>>
>> On 6/10/2013 8:02 AM, Aleksej Efimov wrote:
>>> Hi Joe,
>>> We can replace the "Double.isNaN(d) || Double.isInfinite(d)" with 
>>> "!Double.isFinite(d)" - I agree that this one check looks better, 
>>> but we still need to do the -0.0 -> 0.0 conversion to solve the 
>>> reported problem. And as I understand (might be wrong) modification 
>>> of this check won't help us to achieve this goal, we still need to 
>>> do the conversion:
>>> +            //Convert -0.0 to +0.0 other values remains the same
>>> +            d = d + 0.0;
>>> +
>>
>> Right; changing the set of Double.isFoo methods called earlier 
>> doesn't change the need for the (d + 0.0) expression. I just noticed 
>> the double isFoo calls when looking at the code and saw an 
>> opportunity to use the new method.
>>
>> Cheers,
>>
>> -Joe
>>
>>
>>> Regards,
>>> -Aleksej
>>>
>>> On 06/09/2013 10:23 PM, Joe Darcy wrote:
>>>> Hello Aleksej,
>>>>
>>>> Looking at the code, I have another suggestion. If this code can 
>>>> run exclusively on JDK 8 or later, replace
>>>>
>>>>  955             if (Double.isNaN(d) || Double.isInfinite(d))
>>>>  956                 return(Double.toString(d));
>>>>
>>>> with
>>>>
>>>>  955             if (!Double.isFinite(d))
>>>>  956                 return(Double.toString(d));
>>>>
>>>> Cheers,
>>>>
>>>> -Joe
>>>>
>>>> On 6/9/2013 11:18 AM, Aleksej Efimov wrote:
>>>>> Joe,
>>>>>
>>>>> I definitely like it:
>>>>> 1. Its a one-line change - perfect size.
>>>>> 2. Its fastest one from discussed previously.
>>>>> 3. -0.0 -> 0.0 has tests.
>>>>> 4. And it solves our problem.
>>>>>
>>>>> As a result of all props the next version of webrev: 
>>>>> http://cr.openjdk.java.net/~coffeys/webrev.8015978.v2/ 
>>>>> <http://cr.openjdk.java.net/%7Ecoffeys/webrev.8015978.v2/>
>>>>>
>>>>> Thanks
>>>>> -Aleksej
>>>>>
>>>>> On 06/07/2013 11:11 PM, huizhe wang wrote:
>>>>>> Nice. One-line change, I guess Aleksej would love it :-)
>>>>>>
>>>>>> On 6/7/2013 10:19 AM, Joe Darcy wrote:
>>>>>>> I'll do you one better; you can turn a negative zero into a 
>>>>>>> positive zero leaving other values unchanged like this:
>>>>>>>
>>>>>>>     d = d + 0.0;
>>>>>>>
>>>>>>> In IEEE 754 under the round-to-nearest-even rounding mode 
>>>>>>> required by Java
>>>>>>>     -0.0 + 0.0 => (+)0.0
>>>>>>>
>>>>>>> This trick is used in various places in Java's numerical 
>>>>>>> libraries, is required behavior by our specifications, and even 
>>>>>>> has some tests for it :-)
>>>>>>>
>>>>>>> -Joe
>>>>>>>
>>>>>>> On 6/7/2013 8:43 AM, David Chase wrote:
>>>>>>>> Wouldn't be more efficient to do the following, assuming that 
>>>>>>>> the full Java compilation chain respects the trickiness of 0 vs 
>>>>>>>> -0:
>>>>>>>>
>>>>>>>>     if (d == 0.0) {
>>>>>>>>          d=0.0 // Jam -0 == +0 to +0, per 
>>>>>>>> http://www.w3.org/TR/xpath/#function-string
>>>>>>>>
>>>>>>>>     }
>>>>>>>>
>>>>>>>> Division's plenty more expensive than assigning a constant, 
>>>>>>>> especially on platforms that lack hardware FP division.
>>>>>>>>
>>>>>>>> David
>>>>>>>>
>>>>>>>> On 2013-06-07, at 2:03 AM, huizhe wang <huizhe.wang at oracle.com> 
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Aleksej,
>>>>>>>>>
>>>>>>>>> According to XPath spec, both positive and negative zero are 
>>>>>>>>> converted to the string 0, so it seems doesn't matter. But if 
>>>>>>>>> you want to detect the negative zero, you may do the following:
>>>>>>>>>     if (d == 0.0 && 1/d < 0.0) {
>>>>>>>>>          d=0.0
>>>>>>>>>     }
>>>>>>>>>
>>>>>>>>> Recognizing that (-0.0 == 0.0), and (1/(-0.0) == -Infinity).
>>>>>>>>>
>>>>>>>>> -Joe
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>




More information about the core-libs-dev mailing list