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