static TACommandVerdict exp2l_cmd(TAThread thread,TAInputStream stream) { long double x, res; // Prepare x = readLongDouble(&stream); errno = 0; START_TARGET_OPERATION(thread); // Execute res = exp2l(x); END_TARGET_OPERATION(thread); // Response writeLongDouble(thread, res); writeInt(thread, errno); sendResponse(thread); return taDefaultVerdict; }
void test_exp2() { static_assert((std::is_same<decltype(exp2((double)0)), double>::value), ""); static_assert((std::is_same<decltype(exp2f(0)), float>::value), ""); static_assert((std::is_same<decltype(exp2l(0)), long double>::value), ""); assert(exp2(1) == 2); }
TEST(math, exp2_STRICT_ALIGN_OpenBSD_bug) { // OpenBSD/x86's libm had a bug here, but it was already fixed in FreeBSD: // http://svnweb.FreeBSD.org/base/head/lib/msun/src/math_private.h?revision=240827&view=markup ASSERT_DOUBLE_EQ(5.0, exp2(log2(5))); ASSERT_FLOAT_EQ(5.0f, exp2f(log2f(5))); ASSERT_DOUBLE_EQ(5.0L, exp2l(log2l(5))); }
// // powl // long double powl(long double x, long double y) { if(isnan(x)) return x; if(isnan(y)) return y; return exp2l(y * log2l(x)); }
void testValues() { f = 2; long double result; //result = exp2l(2.0L); // assert result == \pow(2, 2.0); result = exp2l(1.0L); //@ assert result == 2; result = exp2l(0.0L); //@ assert result == 1; result = exp2l(-1.0L); //@ assert result == 0.5L; result = exp2(LDBL_MAX); //@ assert result == HUGE_VALL; //@ assert (math_errhandling & MATH_ERRNO) ==> (errno == ERANGE); //@ assert f == 2; //@ assert vacuous: \false; }
long double exp10l(long double x) { static const long double p10[] = { 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15 }; long double n, y = modfl(x, &n); if (fabsl(n) < 16) { if (!y) return p10[(int)n+15]; y = exp2l(3.32192809488736234787031942948939L * y); return y * p10[(int)n+15]; } return powl(10.0, x); }
long double exp10l(long double x) { static const long double p10[] = { 1e-15L, 1e-14L, 1e-13L, 1e-12L, 1e-11L, 1e-10L, 1e-9L, 1e-8L, 1e-7L, 1e-6L, 1e-5L, 1e-4L, 1e-3L, 1e-2L, 1e-1L, 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15 }; long double n, y = modfl(x, &n); union ldshape u = {n}; /* fabsl(n) < 16 without raising invalid on nan */ if ((u.i.se & 0x7fff) < 0x3fff+4) { if (!y) return p10[(int)n+15]; y = exp2l(3.32192809488736234787031942948939L * y); return y * p10[(int)n+15]; } return powl(10.0, x); }
void run_exp2_tests(void) { int i; /* * We should insist that exp2() return exactly the correct * result and not raise an inexact exception for integer * arguments. */ feclearexcept(FE_ALL_EXCEPT); for (i = FLT_MIN_EXP - FLT_MANT_DIG; i < FLT_MAX_EXP; i++) { assert(exp2f(i) == ldexpf(1.0, i)); assert(fetestexcept(ALL_STD_EXCEPT) == 0); } for (i = DBL_MIN_EXP - DBL_MANT_DIG; i < DBL_MAX_EXP; i++) { assert(exp2(i) == ldexp(1.0, i)); assert(fetestexcept(ALL_STD_EXCEPT) == 0); } for (i = LDBL_MIN_EXP - LDBL_MANT_DIG; i < LDBL_MAX_EXP; i++) { assert(exp2l(i) == ldexpl(1.0, i)); assert(fetestexcept(ALL_STD_EXCEPT) == 0); } }
void domathl (void) { #ifndef NO_LONG_DOUBLE long double f1; long double f2; int i1; f1 = acosl(0.0); fprintf( stdout, "acosl : %Lf\n", f1); f1 = acoshl(0.0); fprintf( stdout, "acoshl : %Lf\n", f1); f1 = asinl(1.0); fprintf( stdout, "asinl : %Lf\n", f1); f1 = asinhl(1.0); fprintf( stdout, "asinhl : %Lf\n", f1); f1 = atanl(M_PI_4); fprintf( stdout, "atanl : %Lf\n", f1); f1 = atan2l(2.3, 2.3); fprintf( stdout, "atan2l : %Lf\n", f1); f1 = atanhl(1.0); fprintf( stdout, "atanhl : %Lf\n", f1); f1 = cbrtl(27.0); fprintf( stdout, "cbrtl : %Lf\n", f1); f1 = ceill(3.5); fprintf( stdout, "ceill : %Lf\n", f1); f1 = copysignl(3.5, -2.5); fprintf( stdout, "copysignl : %Lf\n", f1); f1 = cosl(M_PI_2); fprintf( stdout, "cosl : %Lf\n", f1); f1 = coshl(M_PI_2); fprintf( stdout, "coshl : %Lf\n", f1); f1 = erfl(42.0); fprintf( stdout, "erfl : %Lf\n", f1); f1 = erfcl(42.0); fprintf( stdout, "erfcl : %Lf\n", f1); f1 = expl(0.42); fprintf( stdout, "expl : %Lf\n", f1); f1 = exp2l(0.42); fprintf( stdout, "exp2l : %Lf\n", f1); f1 = expm1l(0.00042); fprintf( stdout, "expm1l : %Lf\n", f1); f1 = fabsl(-1.123); fprintf( stdout, "fabsl : %Lf\n", f1); f1 = fdiml(1.123, 2.123); fprintf( stdout, "fdiml : %Lf\n", f1); f1 = floorl(0.5); fprintf( stdout, "floorl : %Lf\n", f1); f1 = floorl(-0.5); fprintf( stdout, "floorl : %Lf\n", f1); f1 = fmal(2.1, 2.2, 3.01); fprintf( stdout, "fmal : %Lf\n", f1); f1 = fmaxl(-0.42, 0.42); fprintf( stdout, "fmaxl : %Lf\n", f1); f1 = fminl(-0.42, 0.42); fprintf( stdout, "fminl : %Lf\n", f1); f1 = fmodl(42.0, 3.0); fprintf( stdout, "fmodl : %Lf\n", f1); /* no type-specific variant */ i1 = fpclassify(1.0); fprintf( stdout, "fpclassify : %d\n", i1); f1 = frexpl(42.0, &i1); fprintf( stdout, "frexpl : %Lf\n", f1); f1 = hypotl(42.0, 42.0); fprintf( stdout, "hypotl : %Lf\n", f1); i1 = ilogbl(42.0); fprintf( stdout, "ilogbl : %d\n", i1); /* no type-specific variant */ i1 = isfinite(3.0); fprintf( stdout, "isfinite : %d\n", i1); /* no type-specific variant */ i1 = isgreater(3.0, 3.1); fprintf( stdout, "isgreater : %d\n", i1); /* no type-specific variant */ i1 = isgreaterequal(3.0, 3.1); fprintf( stdout, "isgreaterequal : %d\n", i1); /* no type-specific variant */ i1 = isinf(3.0); fprintf( stdout, "isinf : %d\n", i1); /* no type-specific variant */ i1 = isless(3.0, 3.1); fprintf( stdout, "isless : %d\n", i1); /* no type-specific variant */ i1 = islessequal(3.0, 3.1); fprintf( stdout, "islessequal : %d\n", i1); /* no type-specific variant */ i1 = islessgreater(3.0, 3.1); fprintf( stdout, "islessgreater : %d\n", i1); /* no type-specific variant */ i1 = isnan(0.0); fprintf( stdout, "isnan : %d\n", i1); /* no type-specific variant */ i1 = isnormal(3.0); fprintf( stdout, "isnormal : %d\n", i1); /* no type-specific variant */ f1 = isunordered(1.0, 2.0); fprintf( stdout, "isunordered : %d\n", i1); f1 = j0l(1.2); fprintf( stdout, "j0l : %Lf\n", f1); f1 = j1l(1.2); fprintf( stdout, "j1l : %Lf\n", f1); f1 = jnl(2,1.2); fprintf( stdout, "jnl : %Lf\n", f1); f1 = ldexpl(1.2,3); fprintf( stdout, "ldexpl : %Lf\n", f1); f1 = lgammal(42.0); fprintf( stdout, "lgammal : %Lf\n", f1); f1 = llrintl(-0.5); fprintf( stdout, "llrintl : %Lf\n", f1); f1 = llrintl(0.5); fprintf( stdout, "llrintl : %Lf\n", f1); f1 = llroundl(-0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = llroundl(0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = logl(42.0); fprintf( stdout, "logl : %Lf\n", f1); f1 = log10l(42.0); fprintf( stdout, "log10l : %Lf\n", f1); f1 = log1pl(42.0); fprintf( stdout, "log1pl : %Lf\n", f1); f1 = log2l(42.0); fprintf( stdout, "log2l : %Lf\n", f1); f1 = logbl(42.0); fprintf( stdout, "logbl : %Lf\n", f1); f1 = lrintl(-0.5); fprintf( stdout, "lrintl : %Lf\n", f1); f1 = lrintl(0.5); fprintf( stdout, "lrintl : %Lf\n", f1); f1 = lroundl(-0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = lroundl(0.5); fprintf( stdout, "lroundl : %Lf\n", f1); f1 = modfl(42.0,&f2); fprintf( stdout, "lmodfl : %Lf\n", f1); f1 = nanl(""); fprintf( stdout, "nanl : %Lf\n", f1); f1 = nearbyintl(1.5); fprintf( stdout, "nearbyintl : %Lf\n", f1); f1 = nextafterl(1.5,2.0); fprintf( stdout, "nextafterl : %Lf\n", f1); f1 = powl(3.01, 2.0); fprintf( stdout, "powl : %Lf\n", f1); f1 = remainderl(3.01,2.0); fprintf( stdout, "remainderl : %Lf\n", f1); f1 = remquol(29.0,3.0,&i1); fprintf( stdout, "remquol : %Lf\n", f1); f1 = rintl(0.5); fprintf( stdout, "rintl : %Lf\n", f1); f1 = rintl(-0.5); fprintf( stdout, "rintl : %Lf\n", f1); f1 = roundl(0.5); fprintf( stdout, "roundl : %Lf\n", f1); f1 = roundl(-0.5); fprintf( stdout, "roundl : %Lf\n", f1); f1 = scalblnl(1.2,3); fprintf( stdout, "scalblnl : %Lf\n", f1); f1 = scalbnl(1.2,3); fprintf( stdout, "scalbnl : %Lf\n", f1); /* no type-specific variant */ i1 = signbit(1.0); fprintf( stdout, "signbit : %i\n", i1); f1 = sinl(M_PI_4); fprintf( stdout, "sinl : %Lf\n", f1); f1 = sinhl(M_PI_4); fprintf( stdout, "sinhl : %Lf\n", f1); f1 = sqrtl(9.0); fprintf( stdout, "sqrtl : %Lf\n", f1); f1 = tanl(M_PI_4); fprintf( stdout, "tanl : %Lf\n", f1); f1 = tanhl(M_PI_4); fprintf( stdout, "tanhl : %Lf\n", f1); f1 = tgammal(2.1); fprintf( stdout, "tgammal : %Lf\n", f1); f1 = truncl(3.5); fprintf( stdout, "truncl : %Lf\n", f1); f1 = y0l(1.2); fprintf( stdout, "y0l : %Lf\n", f1); f1 = y1l(1.2); fprintf( stdout, "y1l : %Lf\n", f1); f1 = ynl(3,1.2); fprintf( stdout, "ynl : %Lf\n", f1); #endif }
long double t4(unsigned char x) { return exp2l(x); }
npy_longdouble npy_exp2l(npy_longdouble x) { return exp2l(x); }
TEST(math, exp2l) { ASSERT_DOUBLE_EQ(8.0L, exp2l(3.0L)); }
ldcomplex cpowl(ldcomplex z, ldcomplex w) { ldcomplex ans; long double x, y, u, v, t, c, s, r; long double t1, t2, t3, t4, x1, x2, y1, y2, u1, v1, b[4], w1, w2; int ix, iy, hx, hy, hv, hu, iu, iv, i, j, k; x = LD_RE(z); y = LD_IM(z); u = LD_RE(w); v = LD_IM(w); hx = HI_XWORD(x); hy = HI_XWORD(y); hu = HI_XWORD(u); hv = HI_XWORD(v); ix = hx & 0x7fffffff; iy = hy & 0x7fffffff; iu = hu & 0x7fffffff; iv = hv & 0x7fffffff; j = 0; if (v == zero) { /* z**(real) */ if (u == one) { /* (anything) ** 1 is itself */ LD_RE(ans) = x; LD_IM(ans) = y; } else if (u == zero) { /* (anything) ** 0 is 1 */ LD_RE(ans) = one; LD_IM(ans) = zero; } else if (y == zero) { /* real ** real */ LD_IM(ans) = zero; if (hx < 0 && ix < hiinf && iu < hiinf) { /* -x ** u is exp(i*pi*u)*pow(x,u) */ r = powl(-x, u); sincospil(u, &s, &c); LD_RE(ans) = (c == zero)? c: c * r; LD_IM(ans) = (s == zero)? s: s * r; } else LD_RE(ans) = powl(x, u); } else if (x == zero || ix >= hiinf || iy >= hiinf) { if (isnanl(x) || isnanl(y) || isnanl(u)) LD_RE(ans) = LD_IM(ans) = x + y + u; else { if (x == zero) r = fabsl(y); else r = fabsl(x) + fabsl(y); t = atan2pil(y, x); sincospil(t * u, &s, &c); LD_RE(ans) = (c == zero)? c: c * r; LD_IM(ans) = (s == zero)? s: s * r; } } else if (fabsl(x) == fabsl(y)) { /* |x| = |y| */ if (hx >= 0) { t = (hy >= 0)? 0.25L : -0.25L; sincospil(t * u, &s, &c); } else if ((LAST(u) & 3) == 0) { t = (hy >= 0)? 0.75L : -0.75L; sincospil(t * u, &s, &c); } else { r = (hy >= 0)? u : -u; t = -0.25L * r; w1 = r + t; w2 = t - (w1 - r); sincospil(w1, &t1, &t2); sincospil(w2, &t3, &t4); s = t1 * t4 + t3 * t2; c = t2 * t4 - t1 * t3; } if (ix < 0x3ffe0000) /* |x| < 1/2 */ r = powl(fabsl(x + x), u) * exp2l(-0.5L * u); else if (ix >= 0x3fff0000 || iu < 0x400cfff8) /* |x| >= 1 or |u| < 16383 */ r = powl(fabsl(x), u) * exp2l(0.5L * u); else /* special treatment */ j = 2; if (j == 0) { LD_RE(ans) = (c == zero)? c: c * r; LD_IM(ans) = (s == zero)? s: s * r; } } else j = 1; if (j == 0) return (ans); } if (iu >= hiinf || iv >= hiinf || ix >= hiinf || iy >= hiinf) { /* * non-zero imag part(s) with inf component(s) yields NaN */ t = fabsl(x) + fabsl(y) + fabsl(u) + fabsl(v); LD_RE(ans) = LD_IM(ans) = t - t; } else { k = 0; /* no scaling */ if (iu > 0x7ffe0000 || iv > 0x7ffe0000) { u *= 1.52587890625000000000e-05L; v *= 1.52587890625000000000e-05L; k = 1; /* scale u and v by 2**-16 */ } /* * Use similated higher precision arithmetic to compute: * r = u * log(hypot(x, y)) - v * atan2(y, x) * q = u * atan2(y, x) + v * log(hypot(x, y)) */ t1 = __k_clog_rl(x, y, &t2); t3 = __k_atan2l(y, x, &t4); x1 = t1; HALF(x1); y1 = t3; HALF(y1); u1 = u; HALF(u1); v1 = v; HALF(v1); x2 = t2 - (x1 - t1); /* log(hypot(x,y)) = x1 + x2 */ y2 = t4 - (y1 - t3); /* atan2(y,x) = y1 + y2 */ /* compute q = u * atan2(y, x) + v * log(hypot(x, y)) */ if (j != 2) { b[0] = u1 * y1; b[1] = (u - u1) * y1 + u * y2; if (j == 1) { /* v = 0 */ w1 = b[0] + b[1]; w2 = b[1] - (w1 - b[0]); } else { b[2] = v1 * x1; b[3] = (v - v1) * x1 + v * x2; w1 = sum4fpl(b, &w2); } sincosl(w1, &t1, &t2); sincosl(w2, &t3, &t4); s = t1 * t4 + t3 * t2; c = t2 * t4 - t1 * t3; if (k == 1) /* square j times */ for (i = 0; i < 10; i++) { t1 = s * c; c = (c + s) * (c - s); s = t1 + t1; } } /* compute r = u * (t1, t2) - v * (t3, t4) */ b[0] = u1 * x1; b[1] = (u - u1) * x1 + u * x2; if (j == 1) { /* v = 0 */ w1 = b[0] + b[1]; w2 = b[1] - (w1 - b[0]); } else { b[2] = -v1 * y1; b[3] = (v1 - v) * y1 - v * y2; w1 = sum4fpl(b, &w2); } /* scale back unless w1 is large enough to cause exception */ if (k != 0 && fabsl(w1) < 20000.0L) { w1 *= 65536.0L; w2 *= 65536.0L; } hx = HI_XWORD(w1); ix = hx & 0x7fffffff; /* compute exp(w1 + w2) */ k = 0; if (ix < 0x3f8c0000) /* exp(tiny < 2**-115) = 1 */ r = one; else if (ix >= 0x400c6760) /* overflow/underflow */ r = (hx < 0)? tiny * tiny : huge * huge; else { /* compute exp(w1 + w2) */ k = (int) (invln2 * w1 + ((hx >= 0)? 0.5L : -0.5L)); t1 = (long double) k; t2 = w1 - t1 * ln2hil; t3 = w2 - t1 * ln2lol; r = expl(t2 + t3); } if (c != zero) c *= r; if (s != zero) s *= r; if (k != 0) { c = scalbnl(c, k); s = scalbnl(s, k); } LD_RE(ans) = c; LD_IM(ans) = s; } return (ans); }
TEST(math, exp2l) { ASSERT_FLOAT_EQ(8.0, exp2l(3.0)); }
static int testl(long double long_double_x, int int_x, long long_x) { int r = 0; r += __finitel(long_double_x); r += __fpclassifyl(long_double_x); r += __isinfl(long_double_x); r += __isnanl(long_double_x); r += __signbitl(long_double_x); r += acoshl(long_double_x); r += acosl(long_double_x); r += asinhl(long_double_x); r += asinl(long_double_x); r += atan2l(long_double_x, long_double_x); r += atanhl(long_double_x); r += atanl(long_double_x); r += cbrtl(long_double_x); r += ceill(long_double_x); r += copysignl(long_double_x, long_double_x); r += coshl(long_double_x); r += cosl(long_double_x); r += erfcl(long_double_x); r += erfl(long_double_x); r += exp2l(long_double_x); r += expl(long_double_x); r += expm1l(long_double_x); r += fabsl(long_double_x); r += fdiml(long_double_x, long_double_x); r += floorl(long_double_x); r += fmal(long_double_x, long_double_x, long_double_x); r += fmaxl(long_double_x, long_double_x); r += fminl(long_double_x, long_double_x); r += fmodl(long_double_x, long_double_x); r += frexpl(long_double_x, &int_x); r += hypotl(long_double_x, long_double_x); r += ilogbl(long_double_x); r += ldexpl(long_double_x, int_x); r += lgammal(long_double_x); r += llrintl(long_double_x); r += llroundl(long_double_x); r += log10l(long_double_x); r += log1pl(long_double_x); r += log2l(long_double_x); r += logbl(long_double_x); r += logl(long_double_x); r += lrintl(long_double_x); r += lroundl(long_double_x); r += modfl(long_double_x, &long_double_x); r += nearbyintl(long_double_x); r += nextafterl(long_double_x, long_double_x); r += nexttowardl(long_double_x, long_double_x); r += powl(long_double_x, long_double_x); r += remainderl(long_double_x, long_double_x); r += remquol(long_double_x, long_double_x, &int_x); r += rintl(long_double_x); r += roundl(long_double_x); r += scalblnl(long_double_x, long_x); r += scalbnl(long_double_x, int_x); r += sinhl(long_double_x); r += sinl(long_double_x); r += sqrtl(long_double_x); r += tanhl(long_double_x); r += tanl(long_double_x); r += tgammal(long_double_x); r += truncl(long_double_x); return r; }
void runSuccess() { exp2l(0.0L); exp2l(1.0L); exp2l(-1.0L); exp2l(anylongdouble()); }
double exp2(double x) { return exp2l(x); }