JDK 9 RFR of JDK-4851642: Add fused mac to Java math library

joe darcy joe.darcy at oracle.com
Fri Apr 15 05:00:24 UTC 2016


Hi Dmitry,

On 4/14/2016 7:43 PM, Dmitry Nadezhin wrote:
> Hi Joe,
>
> It looks good except a guard expression in the line Math:1550
> (tmp == 0.0 && a == 0.0 || b == 0.0)
> Variables a and b occur asymmetrically in this expression.
> A symmetrical expression would be either
> (a == 0.0 || b == 0.0)
> or
> (product.signum() == 0)

Thank you for the careful review. I wrote some additional tests to cover 
those cases. I believe the current code is functionally correct since (a 
== 0.0 || b == 0.0) implies tmp == 0.0, but I've changed the guard to

     (a == 0.0 || b == 0.0)

and added some more comments. The code in question is now:

             } else { // All inputs finite
                 BigDecimal product = (new BigDecimal(a)).multiply(new 
BigDecimal(b));
                 if (c == 0.0) { // Positive or negative zero
                     // If the product is an exact zero, use a
                     // floating-point expression to compute the sign
                     // of the zero final result. The product is an
                     // exact zero if and only if at least one of a and
                     // b is zero.
                     if (a == 0.0 || b == 0.0) {
                         return a * b + c;
                     } else {
                         // The sign of a zero addend doesn't matter if
                         // the product is nonzero. The sign of a zero
                         // addend is not factored in the result if the
                         // exact product is nonzero but underflows to
                         // zero; see IEEE-754 2008 section 6.3 "The
                         // sign bit".
                         return product.doubleValue();
                     }
                 } else {
                     return product.add(new BigDecimal(c)).doubleValue();
                 }
             }

Final webrev with minor adjustments at

     http://cr.openjdk.java.net/~darcy/4851642.2/

Thanks,

-Joe

>
> On Fri, Apr 15, 2016 at 3:14 AM, joe darcy <joe.darcy at oracle.com 
> <mailto:joe.darcy at oracle.com>> wrote:
>
>     Hello,
>
>     In response to the review comments from Dmitry and Brian, I've
>     prepared another iteration of the webrev:
>
>     http://cr.openjdk.java.net/~darcy/4851642.1/
>     <http://cr.openjdk.java.net/%7Edarcy/4851642.1/>
>
>     Summary of the changes:
>
>     * Renamed the method to "fma" to follow the precedent of the C
>     library.
>     * Added API note citing IEEE 754 operation.
>     * More test cases
>     * More comments
>     * Restructured handling of finite double value to be more
>     straightforward.
>
>     Thanks,
>
>     -Joe
>
>
>     On 4/12/2016 5:21 PM, joe darcy wrote:
>
>         Hello,
>
>         Please review the changes for
>
>             JDK-4851642: Add fused mac to Java math library
>         http://cr.openjdk.java.net/~darcy/4851642.0/
>         <http://cr.openjdk.java.net/%7Edarcy/4851642.0/>
>
>         Fused mac (multiply-accumulate) is a ternary floating-point
>         operation which accepts three inputs, a, b, c, and computes
>
>             a * b + c
>
>         with a single rounding error rather than the usual two
>         rounding errors (a first for the multiply, a second one for
>         the add). The fused mac operation was added in the 2008 update
>         to the IEEE 754 floating-point standard and hardware support
>         for the operation is becoming more and more common in
>         different processor families.
>
>         When present as a hardware instruction, a fused mac can speed
>         up loops such as those for polynomial evaluation. A fused mac
>         can also be used to support a correctly rounding
>         floating-point divide and support various higher-precision
>         operations such as "doubled-double" arithmetic.
>
>         With the increasing availability of fused mac as a hardware
>         primitive, the time has come to add fused mac to the Java math
>         library. Fused mac is an ideal candidate to be intrinsified
>         where hardware support is available. However, this initial
>         implementation does not attempt to add any such intrinsics
>         support in HotSpot; a follow-up RFE has been filed for that
>         work (JDK-8154122). The current library implementation favors
>         code simplicity over speed; a more performant implementation
>         could be written by directly decomposing the floating-point
>         inputs rather than turning to BigDecimal and may be written in
>         the future. More extensive tests could be added in the future
>         as well.
>
>         Thanks,
>
>         -Joe
>
>
>




More information about the core-libs-dev mailing list