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