JDK 9 RFR of JDK-7130085 Port fdlibm hypot to Java
joe darcy
joe.darcy at oracle.com
Wed Sep 23 20:31:58 UTC 2015
Hi Brian,
Thanks for the review; I plan to push a slightly amended version later
today. The new version
* rewords the paragraph you suggested
* declares the method strictfp
* fixes a comparison that mixes integer and floating-point values
* add more test cases near the subnormal threshold
Diff of patches below.
Cheers,
-Joe
# FdLibm.java
77c97
< + public static double compute(double x, double y) {
---
> + public static strictfp double compute(double x, double y) {
99,107c119,134
< + // Note: the uses of ha and hb in hypot could be
< + // eliminated by changing the relative magnitude
< + // comparison below to either a floating-point divide or a
< + // comparison of getExponent results coupled initializing
< + // t1 and t2 using a split generated by floating-point
< + // operations. The range filtering and exponent
< + // adjustments already done by hypot implies should a
< + // split would not need to worry about overflow or
< + // underflow cases.
---
> + // Note: the ha and hb variables are the high-order
> + // 32-bits of a and b stored as integer values. The ha and
> + // hb values are used first for a rough magnitude
> + // comparison of a and b and second for simulating higher
> + // precision by allowing a and b, respectively, to be
> + // decomposed into non-overlapping portions. Both of these
> + // uses could be eliminated. The magnitude comparison
> + // could be eliminated by extracting and comparing the
> + // exponents of a and b or just be performing a
> + // floating-point divide. Splitting a floating-point
> + // number into non-overlapping portions can be
> + // accomplished by judicious use of multiplies and
> + // additions. For details see T. J. Dekker, A Floating
> + // Point Technique for Extending the Available Precision ,
> + // Numerische Mathematik, vol. 18, 1971, pp.224-242 and
> + // subsequent work.
127c154
< + if (hb <= Double.MIN_NORMAL) { // subnormal b or
0 */
---
> + if (b < Double.MIN_NORMAL) { // subnormal b or 0 */
169a197,205
> @@ -97,7 +239,7 @@
> * 1. Compute and return log2(x) in two pieces:
> * log2(x) = w1 + w2,
> * where w1 has 53 - 24 = 29 bit trailing zeros.
> - * 2. Perform y*log2(x) = n+y' by simulating muti-precision
> + * 2. Perform y*log2(x) = n+y' by simulating multi-precision
> * arithmetic, where |y'| <= 0.5.
> * 3. Return x**y = 2**n*exp(y'*log2)
> *
# HypotTests.java
452,460c488,496
< + {0x1.0p500, 0x1.0p440, 0x1.0p500},
< + {0x1.0000000000001p500, 0x1.0p440, 0x1.0000000000001p500},
< + {0x1.0p500, 0x1.0p439, 0x1.0p500},
< + {0x1.0000000000001p500, 0x1.0p439, 0x1.0000000000001p500},
< +
< + {0x1.0p-450, 0x1.0p-500, 0x1.0p-450},
< + {0x1.0000000000001p-450, 0x1.0p-500, 0x1.0000000000001p-450},
< + {0x1.0p-450, 0x1.fffffffffffffp-499, 0x1.0p-450},
< + {0x1.0000000000001p-450, 0x1.fffffffffffffp-499,
0x1.0000000000001p-450},
---
> + {0x1.0p500, 0x1.0p440, 0x1.0p500},
> + {0x1.0000000000001p500, 0x1.0p440, 0x1.0000000000001p500},
> + {0x1.0p500, 0x1.0p439, 0x1.0p500},
> + {0x1.0000000000001p500, 0x1.0p439, 0x1.0000000000001p500},
> +
> + {0x1.0p-450, 0x1.0p-500, 0x1.0p-450},
> + {0x1.0000000000001p-450, 0x1.0p-500,
0x1.0000000000001p-450},
> + {0x1.0p-450, 0x1.fffffffffffffp-499,
0x1.0p-450},
> + {0x1.0000000000001p-450, 0x1.fffffffffffffp-499,
0x1.0000000000001p-450},
473a510,518
> +
> + {0x1.0000000000000p-1022, 0x0.fffffffffffffp-1022,
0x1.6a09e667f3bccp-1022},
> + {0x1.0000000000000p-1021, 0x0.fffffffffffffp-1022,
0x1.1e3779b97f4a8p-1021},
> + {0x1.0000000000000p-1020, 0x0.fffffffffffffp-1022,
0x1.07e0f66afed07p-1020},
> +
> + // 0x0.0000000000001P-1022 is MIN_VALUE (smallest
nonzero number)
> + {0x0.0000000000001p-1022, 0x0.0000000000001p-1022,
0x0.0000000000001p-1022},
> + {0x0.0000000000002p-1022, 0x0.0000000000001p-1022,
0x0.0000000000002p-1022},
> + {0x0.0000000000003p-1022, 0x0.0000000000002p-1022,
0x0.0000000000004p-1022},
-Joe
On 9/22/2015 4:20 PM, Brian Burkhalter wrote:
> Hi Joe,
>
> Overall this looks good. I only have a couple of minor observations
> related to internal documentation.
>
> 1. FdLibm.java
>
> Lines 158-166: The verbiage in the note might benefit from a little
> reworking.
>
> 2. HypotTests.java
>
> Line 46: “Commutative” is misspelled.
>
> Thanks,
>
> Brian
>
> On Sep 21, 2015, at 6:22 PM, Joseph D. Darcy <Joe.Darcy at Oracle.Com
> <mailto:Joe.Darcy at Oracle.Com>> wrote:
>
>> Please review the next portion of the port of fdlibm to Java:
>>
>> JDK-7130085 Port fdlibm hypot to Java
>> http://cr.openjdk.java.net/~darcy/7130085.0/
>> <http://cr.openjdk.java.net/%7Edarcy/7130085.0/>
>>
>> As before with pow, this isn't necessarily the end state of the code
>> we'd like to stop at, but it should be sufficiently idiomatic Java
>> for an initial port.
>>
>> To make comparison against the original C algorithm easier, I listed
>> the C version of hypot as the base file to compare FdLibm.java against.
>
More information about the core-libs-dev
mailing list