RFR: JDK-8302027: Port fdlibm trig functions (sin, cos, tan) to Java

Andrey Turbanov aturbanov at openjdk.org
Wed Mar 1 14:40:37 UTC 2023


On Wed, 1 Mar 2023 05:28:34 GMT, Joe Darcy <darcy at openjdk.org> wrote:

> Last and certainly not least in the port of FDLIBM to Java, the transcendental methods for sin, cos, and tan.
> 
> Some more tests are to be written in the StrictMath directory to verify that the StrictMath algorihtm for sin/cos/tan is being used rather than a different one. However, I wanted to get the rest of the change out for review first.
> 
> The sin/cos/tan methods are grouped together since they share the same argument reduction logic. Argument reduction is the process of mapping an argument of a function to an argument in a restricted range (and possibly returning some function of the reduced argument). For sin, cos, and tan, since they are fundamentally periodic with respect to a multiple of pi, argument reduction is done to find the remainder of the original argument with respect to pi/2.

src/java.base/share/classes/java/lang/FdLibm.java line 166:

> 164:             } else { // argument reduction needed
> 165:                 n = RemPio2.__ieee754_rem_pio2(x, y);
> 166:                 switch(n & 3) {

Suggestion:

                switch (n & 3) {

src/java.base/share/classes/java/lang/FdLibm.java line 209:

> 207:             S4  =  0x1.71de357b1fe7dp-19, //  2.75573137070700676789e-06
> 208:             S5  = -0x1.ae5e68a2b9cebp-26, // -2.50507602534068634195e-08
> 209:             S6  =  0x1.5d93a5acfd57cp-33; //  1.58969099521155010221e-10

Suggestion:

            S1 = -0x1.5555555555549p-3,  // -1.66666666666666324348e-01
            S2 =  0x1.111111110f8a6p-7,  //  8.33333333332248946124e-03
            S3 = -0x1.a01a019c161d5p-13, // -1.98412698298579493134e-04
            S4 =  0x1.71de357b1fe7dp-19, //  2.75573137070700676789e-06
            S5 = -0x1.ae5e68a2b9cebp-26, // -2.50507602534068634195e-08
            S6 =  0x1.5d93a5acfd57cp-33; //  1.58969099521155010221e-10

src/java.base/share/classes/java/lang/FdLibm.java line 221:

> 219:             z       =  x*x;
> 220:             v       =  z*x;
> 221:             r       =  S2 + z*(S3 + z*(S4 + z*(S5 + z*S6)));

Suggestion:

            z = x*x;
            v = z*x;
            r = S2 + z*(S3 + z*(S4 + z*(S5 + z*S6)));

src/java.base/share/classes/java/lang/FdLibm.java line 341:

> 339:             }
> 340:             z  = x*x;
> 341:             r  = z*(C1 + z*(C2 + z*(C3 + z*(C4 + z*(C5 + z*C6)))));

Suggestion:

            z = x*x;
            r = z*(C1 + z*(C2 + z*(C3 + z*(C4 + z*(C5 + z*C6)))));

src/java.base/share/classes/java/lang/FdLibm.java line 444:

> 442:         private static final double
> 443:             pio4  =  0x1.921fb54442d18p-1,  // 7.85398163397448278999e-01
> 444:             pio4lo=  0x1.1a62633145c07p-55, // 3.06161699786838301793e-17

Suggestion:

            pio4   = 0x1.921fb54442d18p-1,  // 7.85398163397448278999e-01
            pio4lo = 0x1.1a62633145c07p-55, // 3.06161699786838301793e-17

src/java.base/share/classes/java/lang/FdLibm.java line 445:

> 443:             pio4  =  0x1.921fb54442d18p-1,  // 7.85398163397448278999e-01
> 444:             pio4lo=  0x1.1a62633145c07p-55, // 3.06161699786838301793e-17
> 445:             T[] =  {

Suggestion:

            T[] = {

src/java.base/share/classes/java/lang/FdLibm.java line 498:

> 496:             }
> 497:             z       =  x*x;
> 498:             w       =  z*z;

Suggestion:

            z = x*x;
            w = z*z;

src/java.base/share/classes/java/lang/FdLibm.java line 579:

> 577:             pio2_2t =  0x1.3198a2e037073p-69,  // 2.02226624879595063154e-21
> 578:             pio2_3  =  0x1.3198a2ep-69,        // 2.02226624871116645580e-21
> 579:             pio2_3t =  0x1.b839a252049c1p-104; // 8.47842766036889956997e-32

Suggestion:

            invpio2 = 0x1.45f306dc9c883p-1,   // 6.36619772367581382433e-01
            pio2_1  = 0x1.921fb544p0,         // 1.57079632673412561417e+00
            pio2_1t = 0x1.0b4611a626331p-34,  // 6.07710050650619224932e-11
            pio2_2  = 0x1.0b4611a6p-34,       // 6.07710050630396597660e-11
            pio2_2t = 0x1.3198a2e037073p-69,  // 2.02226624879595063154e-21
            pio2_3  = 0x1.3198a2ep-69,        // 2.02226624871116645580e-21
            pio2_3t = 0x1.b839a252049c1p-104; // 8.47842766036889956997e-32

src/java.base/share/classes/java/lang/FdLibm.java line 627:

> 625:                     y[0] = r - w;     // quick check no cancellation
> 626:                 } else {
> 627:                     j  = ix >> 20;

Suggestion:

                    j = ix >> 20;

src/java.base/share/classes/java/lang/FdLibm.java line 634:

> 632:                         w  = fn*pio2_2;
> 633:                         r  = t - w;
> 634:                         w  = fn*pio2_2t - ((t - r) - w);

Suggestion:

                        t = r;
                        w = fn*pio2_2;
                        r = t - w;
                        w = fn*pio2_2t - ((t - r) - w);

src/java.base/share/classes/java/lang/FdLibm.java line 675:

> 673:                 nx--;
> 674:             }
> 675:             n  =  KernelRemPio2.__kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);

Suggestion:

            n = KernelRemPio2.__kernel_rem_pio2(tx, y, e0, nx, 2, two_over_pi);

src/java.base/share/classes/java/lang/FdLibm.java line 814:

> 812: 
> 813:         static final double
> 814:             twon24  = 0x1.0p-24; // 5.96046447753906250000e-08

Suggestion:

            twon24 = 0x1.0p-24; // 5.96046447753906250000e-08

src/java.base/share/classes/java/lang/FdLibm.java line 829:

> 827: 
> 828:             // determine jx, jv, q0, note that 3 > q0
> 829:             jx =  nx - 1;

Suggestion:

            jx = nx - 1;

src/java.base/share/classes/java/lang/FdLibm.java line 834:

> 832:                 jv = 0;
> 833:             }
> 834:             q0 =  e0 - 24*(jv + 1);

Suggestion:

            q0 = e0 - 24*(jv + 1);

src/java.base/share/classes/java/lang/FdLibm.java line 852:

> 850: 
> 851:             jz = jk;
> 852:             while(true) {

Suggestion:

            while (true) {

src/java.base/share/classes/java/lang/FdLibm.java line 877:

> 875:                 }
> 876: 
> 877:                 if ( ih > 0) {      // q > 0.5

Suggestion:

                if (ih > 0) {      // q > 0.5

src/java.base/share/classes/java/lang/FdLibm.java line 882:

> 880:                     for (i=0; i < jz; i++) {        // compute 1-q
> 881:                         j = iq[i];
> 882:                         if(carry == 0) {

Suggestion:

                        if (carry == 0) {

src/java.base/share/classes/java/lang/FdLibm.java line 892:

> 890:                     }
> 891:                     if (q0 > 0) {          // rare case: chance is 1 in 12
> 892:                         switch(q0) {

Suggestion:

                        switch (q0) {

src/java.base/share/classes/java/lang/FdLibm.java line 958:

> 956:             // convert integer "bit" chunk to floating-point value
> 957:             fw = Math.scalb(1.0, q0);
> 958:             for(i = jz; i>=0; i--) {

Suggestion:

            for (i = jz; i>=0; i--) {

src/java.base/share/classes/java/lang/FdLibm.java line 964:

> 962: 
> 963:             // compute PIo2[0,...,jp]*q[jz,...,0]
> 964:             for(i = jz; i>=0; i--) {

Suggestion:

            for (i = jz; i>=0; i--) {

src/java.base/share/classes/java/lang/FdLibm.java line 972:

> 970: 
> 971:             // compress fq[] into y[]
> 972:             switch(prec) {

Suggestion:

            switch (prec) {

src/java.base/share/classes/java/lang/FdLibm.java line 997:

> 995:                     fw      = fq[i - 1] + fq[i];
> 996:                     fq[i]  += fq[i - 1] - fw;
> 997:                     fq[i - 1] = fw;

Suggestion:

                    fw        = fq[i - 1] + fq[i];
                    fq[i]    += fq[i - 1] - fw;
                    fq[i - 1] = fw;

-------------

PR: https://git.openjdk.org/jdk/pull/12800


More information about the core-libs-dev mailing list