Exemple #1
0
    public static FInt Sqrt(FInt f, int NumberOfIterations) {
      if (f.RawValue < 0) //NaN in Math.Sqrt
        throw new ArithmeticException("Input Error");
      if (f.RawValue == 0)
        return (FInt)0;
      var k = (f + FInt.OneF) >> 1;
      for (var i = 0; i < NumberOfIterations; i++)
        k = (k + (f / k)) >> 1;

      if (k.RawValue < 0)
        throw new ArithmeticException("Overflow");
      else
        return k;
    }
Exemple #2
0
    public static FInt Asin(FInt F) {
      var isNegative = F < 0;
      F = Abs(F);

      if (F > FInt.OneF)
        throw new ArithmeticException("Bad Asin Input:" + F.ToDouble());

      var f1 = mul(mul(mul(mul(FInt.Create(145103 >> FInt.SHIFT_AMOUNT, false), F) -
          FInt.Create(599880 >> FInt.SHIFT_AMOUNT, false), F) +
          FInt.Create(1420468 >> FInt.SHIFT_AMOUNT, false), F) -
          FInt.Create(3592413 >> FInt.SHIFT_AMOUNT, false), F) +
          FInt.Create(26353447 >> FInt.SHIFT_AMOUNT, false);
      var f2 = (PI / FInt.Create(2, true)) - (Sqrt(FInt.OneF - F) * f1);

      return isNegative ? f2.Inverse : f2;
    }
Exemple #3
0
    public static FInt Atan2(FInt F1, FInt F2) {
      if (F2.RawValue == 0 && F1.RawValue == 0)
        return (FInt)0;

      var result = (FInt)0;
      if (F2 > 0)
        result = Atan(F1 / F2);
      else if (F2 < 0) {
        if (F1 >= 0)
          result = (PI - Atan(Abs(F1 / F2)));
        else
          result = (PI - Atan(Abs(F1 / F2))).Inverse;
      }
      else
        result = (F1 >= 0 ? PI : PI.Inverse) / FInt.Create(2, true);

      return result;
    }
Exemple #4
0
 public static FInt Sin(FInt i) {
   var j = (FInt)0;
   for (; i < 0; i += FInt.Create(25736, false))
     ;
   if (i > FInt.Create(25736, false))
     i %= FInt.Create(25736, false);
   var k = (i * FInt.Create(10, false)) / FInt.Create(714, false);
   if (i != 0 && i != FInt.Create(6434, false) && i != FInt.Create(12868, false) &&
       i != FInt.Create(19302, false) && i != FInt.Create(25736, false))
     j = ((i * FInt.Create(100, false)) / FInt.Create(714, false)) - (k * FInt.Create(10, false));
   if (k <= FInt.Create(90, false))
     return sin_lookup(k, j);
   if (k <= FInt.Create(180, false))
     return sin_lookup(FInt.Create(180, false) - k, j);
   if (k <= FInt.Create(270, false))
     return sin_lookup(k - FInt.Create(180, false), j).Inverse;
   else
     return sin_lookup(FInt.Create(360, false) - k, j).Inverse;
 }
Exemple #5
0
 private static FInt mul(FInt F1, FInt F2) {
   return F1 * F2;
 }
Exemple #6
0
 public static FInt Abs(FInt F) {
   if (F < 0)
     return F.Inverse;
   else
     return F;
 }
Exemple #7
0
 public static FInt Atan(FInt F) {
   return Asin(F / Sqrt(FInt.OneF + (F * F)));
 }
Exemple #8
0
 public static FInt Tan(FInt i) {
   return Sin(i) / Cos(i);
 }
Exemple #9
0
 public static FInt Cos(FInt i) {
   return Sin(i + FInt.Create(6435, false));
 }
Exemple #10
0
 public static FPoint Create(FInt X, FInt Y) {
   FPoint fp;
   fp.X = X;
   fp.Y = Y;
   return fp;
 }
Exemple #11
0
 public static FInt operator >>(FInt one, int Amount) {
   return FInt.Create(one.RawValue >> Amount, false);
 }