privatestaticfinaldouble C = 5.42857142857142815906e-01; /* 19/35 = 0x3FE15F15, 0xF15F15F1 */ privatestaticfinaldouble D = -7.05306122448979611050e-01; /* -864/1225 = 0xBFE691DE, 0x2532C834 */ privatestaticfinaldouble E = 1.41428571428571436819e+00; /* 99/70 = 0x3FF6A0EA, 0x0EA0EA0F */ privatestaticfinaldouble F = 1.60714285714285720630e+00; /* 45/28 = 0x3FF9B6DB, 0x6DB6DB6E */ privatestaticfinaldouble G = 3.57142857142857150787e-01; /* 5/14 = 0x3FD6DB6D, 0xB6DB6DB7 */
publicstaticstrictfpdouble compute(double x) { int hx; double r, s, t=0.0, w; int sign; // unsigned
hx = __HI(x); // high word of x
sign = hx & 0x80000000; // sign= sign(x)
hx ^= sign; if (hx >= 0x7ff00000) return (x+x); // cbrt(NaN,INF) is itself if ((hx | __LO(x)) == 0) return(x); // cbrt(0) is itself
x = __HI(x, hx); // x <- |x| // rough cbrt to 5 bits if (hx < 0x00100000) { // subnormal number
t = __HI(t, 0x43500000); // set t= 2**54
t *= x;
t = __HI(t, __HI(t)/3+B2);
} else {
t = __HI(t, hx/3+B1);
}
// new cbrt to 23 bits, may be implemented in single precision
r = t * t/x;
s = C + r*t;
t *= G + F/(s + E + D/s);
// chopped to 20 bits and make it larger than cbrt(x)
t = __LO(t, 0);
t = __HI(t, __HI(t)+0x00000001);
// one step newton iteration to 53 bits with error less than 0.667 ulps
s = t * t; // t*t is exact
r = x / s;
w = t + t;
r= (r - t)/(w + r); // r-s is exact
t= t + t*r;
// retore the sign bit
t = __HI(t, __HI(t) | sign); return(t);
}
}
ha = __HI(x) & 0x7fffffff; // high word of x
hb = __HI(y) & 0x7fffffff; // high word of y if(hb > ha) {
a = y;
b = x;
j = ha;
ha = hb;
hb = j;
} else {
a = x;
b = y;
}
a = __HI(a, ha); // a <- |a|
b = __HI(b, hb); // b <- |b| if ((ha - hb) > 0x3c00000) { return a + b; // x / y > 2**60
}
k=0; if (ha > 0x5f300000) { // a>2**500 if (ha >= 0x7ff00000) { // Inf or NaN
w = a + b; // for sNaN if (((ha & 0xfffff) | __LO(a)) == 0)
w = a; if (((hb ^ 0x7ff00000) | __LO(b)) == 0)
w = b; return w;
} // scale a and b by 2**-600
ha -= 0x25800000;
hb -= 0x25800000;
k += 600;
a = __HI(a, ha);
b = __HI(b, hb);
} if (hb < 0x20b00000) { // b < 2**-500 if (hb <= 0x000fffff) { // subnormal b or 0 */ if ((hb | (__LO(b))) == 0) return a;
t1 = 0;
t1 = __HI(t1, 0x7fd00000); // t1=2^1022
b *= t1;
a *= t1;
k -= 1022;
} else { // scale a and b by 2^600
ha += 0x25800000; // a *= 2^600
hb += 0x25800000; // b *= 2^600
k -= 600;
a = __HI(a, ha);
b = __HI(b, hb);
}
} // medium size a and b
w = a - b; if (w > b) {
t1 = 0;
t1 = __HI(t1, ha);
t2 = a - t1;
w = Math.sqrt(t1*t1 - (b*(-b) - t2 * (a + t1)));
} else {
a = a + a;
y1 = 0;
y1 = __HI(y1, hb);
y2 = b - y1;
t1 = 0;
t1 = __HI(t1, ha + 0x00100000);
t2 = a - t1;
w = Math.sqrt(t1*y1 - (w*(-w) - (t1*y2 + t2*b)));
} if (k != 0) {
t1 = 1.0; int t1_hi = __HI(t1);
t1_hi += (k << 20);
t1 = __HI(t1, t1_hi); return t1 * w;
} else return w;
}
}
/* argument reduction */ if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
} else {
k = (int)(invln2*x+halF[xsb]);
t = k;
hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */
lo = t*ln2LO[0];
}
x = hi - lo;
} elseif(hx < 0x3e300000) { /* when |x|<2**-28 */ if(huge+x>one) return one+x;/* trigger inexact */
} else k = 0;
/* x is now in primary range */
t = x*x;
c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); if(k==0) return one-((x*c)/(c-2.0)-x); else y = one-((lo-(x*c)/(2.0-c))-hi); if(k >= -1021) {
y = __HI(y, __HI(y) + (k<<20)); /* add k to y's exponent */ return y;
} else {
y = __HI(y, __HI(y) + ((k+1000)<<20));/* add k to y's exponent */ return y*twom1000;
}
}
}
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.23Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.