public static FInt Sqrt(FInt f)
        {
            byte numberOfIterations = 8;

            if (f.RawValue > 0x64000)
            {
                numberOfIterations = 12;
            }
            if (f.RawValue > 0x3e8000)
            {
                numberOfIterations = 16;
            }
            return(Sqrt(f, numberOfIterations));
        }
        public static FInt Asin(FInt F)
        {
            bool isNegative = F < 0;

            F = Abs(F);

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

            FInt 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);
            FInt f2 = PI / FInt.Create(2, true) - (Sqrt(FInt.OneF - F) * f1);

            return(isNegative ? f2.Inverse : f2);
        }
        public static FInt Sin(FInt i)
        {
            FInt j = (FInt)0;

            for (; i < 0; i += FInt.Create(25736, false))
            {
                ;
            }
            if (i > FInt.Create(25736, false))
            {
                i %= FInt.Create(25736, false);
            }
            FInt 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);
            }
        }
 public static FInt Atan(FInt F)
 {
     return(Asin(F / Sqrt(FInt.OneF + (F * F))));
 }
 public static FInt Tan(FInt i)
 {
     return(Sin(i) / Cos(i));
 }
 public static FInt Cos(FInt i)
 {
     return(Sin(i + FInt.Create(6435, false)));
 }
 private static FInt mul(FInt F1, FInt F2)
 {
     return(F1 * F2);
 }
 public static FInt operator >>(FInt one, int amount)
 {
     return(FInt.Create(one.RawValue >> amount, false));
 }