public static Fix Atan2(Fix f1, Fix f2)
        {
            if (f2.Raw == 0 && f1.Raw == 0)
            {
                return(0);
            }

            Fix result;

            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) / Fix.Create(2, true);
            }

            return(result);
        }
        public static Fix Asin(Fix f)
        {
            var isNegative = f < 0;

            f = Abs(f);

            if (f > Fix.One)
            {
                throw new ArithmeticException("Bad Asin Input:" + f.AsFloat);
            }

            var f1 = Fix.Mul(Fix.Mul(Fix.Mul(Fix.Mul(Fix.Create(145103 >> Fix.ShiftAmount, false), f) -
                                             Fix.Create(599880 >> Fix.ShiftAmount, false), f) +
                                     Fix.Create(1420468 >> Fix.ShiftAmount, false), f) -
                             Fix.Create(3592413 >> Fix.ShiftAmount, false), f) +
                     Fix.Create(26353447 >> Fix.ShiftAmount, false);
            var f2 = Pi / Fix.Create(2, true) - (Sqrt(Fix.One - f) * f1);

            return(isNegative ? f2.Inverse : f2);
        }
 public static Fix Cos(Fix i)
 {
     return(Sin(i + Fix.Create(6435, false)));
 }