예제 #1
0
char
_trigreduce(
  floatnum x,
  int digits)
{
  floatstruct tmp;
  int expx, save;
  signed char sgn;
  char odd;

  if (float_abscmp(x, &cPi) <= 0)
    return 1;
  expx = float_getexponent(x);
  if (expx > float_getlength(&cPi) - digits)
    return 0;
  save = float_setprecision(MAXDIGITS);
  float_create(&tmp);
  sgn = float_getsign(x);
  float_abs(x);
  float_divmod(&tmp, x, x, &cPi, INTQUOT);
  float_setprecision(save);
  odd = float_isodd(&tmp);
  if (odd)
    float_sub(x, x, &cPi, digits+1);
  if (sgn < 0)
    float_neg(x);
  float_free(&tmp);
  return 1;
}
예제 #2
0
void
floatmath_init()
{
  int i, save;
  floatnum_init();

  save = float_setprecision(MAXDIGITS);
  float_create(&c1);
  float_setinteger(&c1, 1);
  float_create(&c2);
  float_setinteger(&c2, 2);
  float_create(&c3);
  float_setinteger(&c3, 3);
  float_create(&c12);
  float_setinteger(&c12, 12);
  float_create(&c16);
  float_setinteger(&c16, 16);
  float_create(&cMinus1);
  float_setinteger(&cMinus1, -1);
  float_create(&cMinus20);
  float_setinteger(&cMinus20, -20);
  float_create(&c1Div2);
  float_setscientific(&c1Div2, ".5", NULLTERMINATED);
  float_create(&cExp);
  float_setscientific(&cExp, sExp, NULLTERMINATED);
  float_create(&cLn2);
  float_setscientific(&cLn2, sLn2, NULLTERMINATED);
  float_create(&cLn3);
  float_setscientific(&cLn3, sLn3, NULLTERMINATED);
  float_create(&cLn7);
  float_setscientific(&cLn7, sLn7, NULLTERMINATED);
  float_create(&cLn10);
  float_setscientific(&cLn10, sLn10, NULLTERMINATED);
  float_create(&cPhi);
  float_setscientific(&cPhi, sPhi, NULLTERMINATED);
  float_create(&cPi);
  float_setscientific(&cPi, sPi, NULLTERMINATED);
  float_create(&cPiDiv2);
  float_setscientific(&cPiDiv2, sPiDiv2, NULLTERMINATED);
  float_create(&cPiDiv4);
  float_setscientific(&cPiDiv4, sPiDiv4, NULLTERMINATED);
  float_create(&c2Pi);
  float_setscientific(&c2Pi, s2Pi, NULLTERMINATED);
  float_create(&c1DivPi);
  float_setscientific(&c1DivPi, s1DivPi, NULLTERMINATED);
  float_create(&cSqrtPi);
  float_setscientific(&cSqrtPi, sSqrtPi, NULLTERMINATED);
  float_create(&cLnSqrt2PiMinusHalf);
  float_setscientific(&cLnSqrt2PiMinusHalf, sLnSqrt2PiMinusHalf,
                      NULLTERMINATED);
  float_create(&c1DivSqrtPi);
  float_setscientific(&c1DivSqrtPi, s1DivSqrtPi, NULLTERMINATED);
  float_create(&c2DivSqrtPi);
  float_setscientific(&c2DivSqrtPi, s2DivSqrtPi, NULLTERMINATED);
  float_create(&cMinus0_4);
  float_setscientific(&cMinus0_4, "-.4", NULLTERMINATED);
  for (i = -1; ++i < MAXBERNOULLIIDX;)
  {
    float_create(&cBernoulliNum[i]);
    float_create(&cBernoulliDen[i]);
    float_setscientific(&cBernoulliNum[i], sBernoulli[2*i], NULLTERMINATED);
    float_setscientific(&cBernoulliDen[i], sBernoulli[2*i+1], NULLTERMINATED);
  }
  float_create(&cUnsignedBound);
  float_copy(&cUnsignedBound, &c1, EXACT);
  for (i = -1; ++i < 2*(int)sizeof(unsigned);)
    float_mul(&cUnsignedBound, &c16, &cUnsignedBound, EXACT);
  for (i = -1; ++i < MAXERFCIDX;)
    float_create(&erfccoeff[i]);
  float_create(&erfcalpha);
  float_create(&erfcalphasqr);
  float_create(&erfct2);
  float_create(&erfct3);
  float_setprecision(save);
}