int main(void) { float NaN = 0.0f / 0.0f; float Inf = 1.0f / 0.0f; float negInf = -1.0f / 0.0f; float x = 2.0f; float y = -8.5; float a = 5.1; float b = -3.0f; float c = fmodf(a, b); assert(fabsf(c - 2.1) < 1e-8); if (!__isnanf(y)) { assert(__isnanf(fmodf(Inf, y))); assert(__isnanf(fmodf(negInf, y))); } if (!__isnanf(x)) { assert(__isnanf(fmodf(x, 0.0f))); assert(__isnanf(fmodf(x, -0.0f))); } if (!__isnanf(x) && !__isinff(x)) { assert(fmodf(x, Inf) == x); assert(fmodf(x, negInf) == x); } if (!__isnanf(y) && !__iszerof(y)) { assert(fmodf(0.0f, y) == 0.0f); assert(fmodf(-0.0f, y) == -0.0f); int isNeg = __signbitf(fmodf(-0.0f, y)); assert(isNeg); } assert(__isnanf(fmodf(NaN, y))); assert(__isnanf(fmodf(x, NaN))); return 0; }
TEST(math, log1pf) { ASSERT_EQ(-HUGE_VALF, log1pf(-1.0f)); ASSERT_TRUE(isnanf(log1pf(nanf("")))); ASSERT_TRUE(__isinff(log1pf(HUGE_VALF))); ASSERT_FLOAT_EQ(1.0f, log1pf(static_cast<float>(M_E) - 1.0f)); }
float __ieee754_expf (float x) { static const float himark = 88.72283935546875; static const float lomark = -103.972084045410; /* Check for usual case. */ if (isless (x, himark) && isgreater (x, lomark)) { static const float THREEp42 = 13194139533312.0; static const float THREEp22 = 12582912.0; /* 1/ln(2). */ #undef M_1_LN2 static const float M_1_LN2 = 1.44269502163f; /* ln(2) */ #undef M_LN2 static const double M_LN2 = .6931471805599452862; int tval; double x22, t, result, dx; float n, delta; union ieee754_double ex2_u; fenv_t oldenv; feholdexcept (&oldenv); #ifdef FE_TONEAREST fesetround (FE_TONEAREST); #endif /* Calculate n. */ n = x * M_1_LN2 + THREEp22; n -= THREEp22; dx = x - n*M_LN2; /* Calculate t/512. */ t = dx + THREEp42; t -= THREEp42; dx -= t; /* Compute tval = t. */ tval = (int) (t * 512.0); if (t >= 0) delta = - __exp_deltatable[tval]; else delta = __exp_deltatable[-tval]; /* Compute ex2 = 2^n e^(t/512+delta[t]). */ ex2_u.d = __exp_atable[tval+177]; ex2_u.ieee.exponent += (int) n; /* Approximate e^(dx+delta) - 1, using a second-degree polynomial, with maximum error in [-2^-10-2^-28,2^-10+2^-28] less than 5e-11. */ x22 = (0.5000000496709180453 * dx + 1.0000001192102037084) * dx + delta; /* Return result. */ fesetenv (&oldenv); result = x22 * ex2_u.d + ex2_u.d; return (float) result; } /* Exceptional cases: */ else if (isless (x, himark)) { if (__isinff (x)) /* e^-inf == 0, with no error. */ return 0; else /* Underflow */ return TWOM100 * TWOM100; } else /* Return x, if x is a NaN or Inf; or overflow, otherwise. */ return TWO127*x; }
TEST(math, __isinff) { ASSERT_FALSE(__isinff(123.0f)); ASSERT_TRUE(__isinff(HUGE_VALF)); }