#include <perms.h>
const float Pio4 = 0.7853981633974483096156608;
const float Pio2 = 1.570796326794896619231322;
const float Pi = 3.141592653589793238462643;
const float Pi2 = 6.283185307179586476925287;
const float E = 2.718281828;
float Normalise(float X) {
  X = X - Intpt(X / Pi2) * Pi2;
  if (X <= -Pi) return (Pi2 + X);
  if (X >= Pi) return (X - Pi2);
  return (X);
}
float Rawsine(float X) {
  float Y;
  Y = X * X;
  return ((((0.0032811761 * Y - 0.1335639326) * Y + 1.0) * X) /
          ((0.0004649838 * Y + 0.0331027317) * Y + 1.0));
}
float Rawcosine(float X) {
  float Y;
  Y = X * X;
  return (((0.0205121130 * Y - 0.4558922221) * Y + 0.9999999992) /
          ((0.0008996261 * Y + 0.0441077396) * Y + 1.0));
}
float Sin(float X) {
  if (X < 0) return (-Sin(-X));
  X = Normalise(X);
  if (X > Pio2) X = Pi - X;
  if (X > Pio4) return (Rawcosine(Pio2 - X));
  return (Rawsine(X));
}
float Cos(float X) {
  X = Normalise(X);
  if (X < 0) X = -X;
  if (X > Pio2) {
    X = Pi - X;
    if (X > Pio4) return (-Rawsine(Pio2 - X));
    return (-Rawcosine(X));
  } else {
    if (X > Pio4) return (Rawsine(Pio2 - X));
    return (Rawcosine(X));
  }
}
float Tan(float X) { return (Sin(X) / Cos(X)); }
float Atan(float X) {
  float Y;
  Y = X * X;
  return (X *
          (((0.0089472229 * Y + 0.2870044785) * Y + 1.1303754276) * Y +
           0.9999999992) /
          (((0.0506770959 * Y + 0.5749098994) * Y + 1.4637086946) * Y + 1.0));
}
float Parctan(float X) {
  if (X < 0) return (-Parctan(-X));
  if (0 <= X && X <= 1.0) return (Atan(X));
  return (Pio2 - Atan(1.0 / X));
}
float Arctan(float X, float Y) {
  float Z;
  Z = Parctan(Y / X);
  if (X >= 0) return (Z);
  if (Z > 0) return (Pi - Z);
  return (-Pi - Z);
}
float Arcsin(float X) {
  if (X >= 1.0) {
    if (X > 1.0) _imp_signal(10, 0, 0, _imp_str_literal(""));
    return (Pio2);
  }
  if (X <= -1.0) {
    if (X < 1.0) _imp_signal(10, 0, 0, _imp_str_literal(""));
    return (-Pio2);
  }
  return (Parctan(X / (Sqrt(1.0 - X * X))));
}
float Arccos(float X) {
  float W;
  if (X > 0.999) {
    if (X > 1.0) _imp_signal(10, 0, 0, _imp_str_literal(""));
    return (0);
  }
  if (X < -0.999) {
    if (X < -1.0) _imp_signal(10, 0, 0, _imp_str_literal(""));
    return (Pi);
  }
  if (-0.001 < X && X < 0.001) return (Pio2);
  W = Parctan(Sqrt((1.0 / (X * X)) - 1.0));
  if (X >= 0) return (W);
  return (-W + Pi);
}
float Loge(float Z) {
  float X;
  float Y;
  X = Z + Z - 1.0;
  Y = X * X;
  return (((0.0956558162 * X + 0.5297501385) * Y + 0.0677412133 * X -
           0.6931471773) /
          ((0.0286818192 * X + 0.45477291277) * Y + 1.3449644663 * X + 1.0));
}
float Log(float X) {
  const float Logoftwo = 0.6931471806;
  int Factor;
  Factor = 0;
  if (X <= 0) _imp_signal(10, 0, 0, _imp_str_literal(""));
  if (X > 1.0) {
    do {
      Factor = Factor + 1;
      X = X / 2;
    } while (0.5 <= X && X <= 1.0);
    return (Loge(X) + Factor * Logoftwo);
  } else {
    if (X >= 0.5) return (Loge(X));
    do {
      Factor = Factor + 1;
      X = X + X;
    } while (0.5 <= X && X <= 1.0);
    return (Loge(X) - Factor * Logoftwo);
  }
}
float Logten(float X) { return (Log(X) / Log(10.0)); }
float Rawexp(float X) {
  float Y;
  Y = X * X;
  return (((0.0106337905 * X + 0.1125548636) * Y + 0.5240642207 * X + 1.0) /
          ((0.0884921370 - 0.0065658101 * X) * Y + 1.0000000007 -
           0.4759358618 * X));
}
float Exp(float X) {
  float Temp;
  if (-1.0 <= X && X <= 1.0) {
    if (X >= 0) return (Rawexp(X));
    return (1.0 / Rawexp(-X));
  } else {
    Temp = Exp(0.5 * X);
    return (Temp * Temp);
  }
}
float Sinh(float X) { return (0.5 * (Exp(X) - Exp(-X))); }
float Cosh(float X) { return (0.5 * (Exp(X) + Exp(-X))); }
float Tanh(float X) { return (Sinh(X) / Cosh(X)); }
