Ejemplo n.º 1
0
        public static DeterministicFloat PIOver180F = PI / (DeterministicFloat)180;         //PI / 180
        #endregion

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

            for (int i = 0; i < NumberOfIterations; i++)
            {
                k = (k + (f / k)) >> 1;
            }

            if (k.RawValue < 0)
            {
                throw new ArithmeticException("Overflow");
            }
            else
            {
                return(k);
            }
        }
Ejemplo n.º 2
0
        public static DeterministicFloat Atan2(DeterministicFloat F1, DeterministicFloat F2)
        {
            if (F2.RawValue == 0 && F1.RawValue == 0)
            {
                return((DeterministicFloat)0);
            }

            DeterministicFloat result = (DeterministicFloat)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) / new DeterministicFloat(2, true);
            }

            return(result);
        }
Ejemplo n.º 3
0
        public static DeterministicFloat Min(DeterministicFloat x1, DeterministicFloat x2)
        {
            if (x2 < x1)
            {
                return(x2);
            }

            return(x1);
        }
Ejemplo n.º 4
0
        public static DeterministicFloat Max(DeterministicFloat x1, DeterministicFloat x2)
        {
            if (x1 < x2)
            {
                return(x2);
            }

            return(x1);
        }
Ejemplo n.º 5
0
        public static DeterministicFloat Abs(DeterministicFloat F)
        {
            if (F < 0)
            {
                return(F.Inverse);
            }

            return(F);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Create a fixed-int number from parts.  For example, to create 1.5 pass in 1 and 500.
        /// </summary>
        /// <param name="PreDecimal">The number above the decimal.  For 1.5, this would be 1.</param>
        /// <param name="PostDecimal">The number below the decimal, to three digits.
        /// For 1.5, this would be 500. For 1.005, this would be 5.</param>
        /// <returns>A fixed-int representation of the number parts</returns>
        public static DeterministicFloat FromParts(int PreDecimal, int PostDecimal)
        {
            DeterministicFloat f = new DeterministicFloat(PreDecimal);

            if (PostDecimal != 0)
            {
                f.RawValue += (new DeterministicFloat(PostDecimal) / 1000).RawValue;
            }

            return(f);
        }
Ejemplo n.º 7
0
 private static DeterministicFloat sin_lookup(DeterministicFloat i, DeterministicFloat j)
 {
     if (j > 0 && j < new DeterministicFloat(10, false) && i < new DeterministicFloat(90, false))
     {
         return(new DeterministicFloat(SIN_TABLE[i.RawValue], false) +
                ((new DeterministicFloat(SIN_TABLE[i.RawValue + 1], false) - new DeterministicFloat(SIN_TABLE[i.RawValue], false)) /
                 new DeterministicFloat(10, false)) * j);
     }
     else
     {
         return(new DeterministicFloat(SIN_TABLE[i.RawValue], false));
     }
 }
Ejemplo n.º 8
0
        public static DeterministicFloat Sqrt(DeterministicFloat f)
        {
            byte numberOfIterations = 8;

            if (f.RawValue > 0x64000)
            {
                numberOfIterations = 12;
            }
            if (f.RawValue > 0x3e8000)
            {
                numberOfIterations = 16;
            }
            return(Sqrt(f, numberOfIterations));
        }
Ejemplo n.º 9
0
        public static DeterministicFloat Asin(DeterministicFloat f)
        {
            bool isNegative = f < 0;

            f = Abs(f);

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

            DeterministicFloat f1 = mul(mul(mul(mul(new DeterministicFloat(145103 >> DeterministicFloat.SHIFT_AMOUNT, false), f) -
                                                new DeterministicFloat(599880 >> DeterministicFloat.SHIFT_AMOUNT, false), f) +
                                            new DeterministicFloat(1420468 >> DeterministicFloat.SHIFT_AMOUNT, false), f) -
                                        new DeterministicFloat(3592413 >> DeterministicFloat.SHIFT_AMOUNT, false), f) +
                                    new DeterministicFloat(26353447 >> DeterministicFloat.SHIFT_AMOUNT, false);
            DeterministicFloat f2 = PI / new DeterministicFloat(2, true) - (Sqrt(DeterministicFloat.OneF - f) * f1);

            return(isNegative ? f2.Inverse : f2);
        }
Ejemplo n.º 10
0
        public static DeterministicFloat Sin(DeterministicFloat i)
        {
            DeterministicFloat j = (DeterministicFloat)0;

            for (; i < 0; i += new DeterministicFloat(25736, false))
            {
                ;
            }
            if (i > new DeterministicFloat(25736, false))
            {
                i %= new DeterministicFloat(25736, false);
            }
            DeterministicFloat k = (i * new DeterministicFloat(10, false)) / new DeterministicFloat(714, false);

            if (i != 0 && i != new DeterministicFloat(6434, false) && i != new DeterministicFloat(12868, false) &&
                i != new DeterministicFloat(19302, false) && i != new DeterministicFloat(25736, false))
            {
                j = (i * new DeterministicFloat(100, false)) / new DeterministicFloat(714, false) - k * new DeterministicFloat(10, false);
            }
            if (k <= new DeterministicFloat(90, false))
            {
                return(sin_lookup(k, j));
            }
            if (k <= new DeterministicFloat(180, false))
            {
                return(sin_lookup(new DeterministicFloat(180, false) - k, j));
            }
            if (k <= new DeterministicFloat(270, false))
            {
                return(sin_lookup(k - new DeterministicFloat(180, false), j).Inverse);
            }
            else
            {
                return(sin_lookup(new DeterministicFloat(360, false) - k, j).Inverse);
            }
        }
Ejemplo n.º 11
0
 public static DeterministicFloat Atan(DeterministicFloat F)
 {
     return(Asin(F / Sqrt(DeterministicFloat.OneF + (F * F))));
 }
Ejemplo n.º 12
0
 public static DeterministicFloat Acos(DeterministicFloat f)
 {
     return(Asin(f) * -1 + HalfPIF);
 }
Ejemplo n.º 13
0
 public static DeterministicFloat Tan(DeterministicFloat i)
 {
     return(Sin(i) / Cos(i));
 }
Ejemplo n.º 14
0
 public static DeterministicFloat Cos(DeterministicFloat i)
 {
     return(Sin(i + new DeterministicFloat(6435, false)));
 }
Ejemplo n.º 15
0
 private static DeterministicFloat mul(DeterministicFloat F1, DeterministicFloat F2)
 {
     return(F1 * F2);
 }