Ejemplo n.º 1
0
        public FixPoint Distance(ref Vector3FP v3fp)
        {
            FixPoint dx = v3fp.x - x;
            FixPoint dy = v3fp.y - y;
            FixPoint dz = v3fp.z - z;

            return(FixPoint.Sqrt(dx * dx + dy * dy + dz * dz));
        }
Ejemplo n.º 2
0
    public void TestSqrt()
    {
        m_max_precision_times = 0m;
        m_max_delta_percent   = 0m;
        int max_int = (int)(Math.Sqrt((double)(int.MaxValue)));

        for (int i = 0; i < max_int; ++i)
        {
            int      value   = i * i;
            FixPoint fp      = new FixPoint(value);
            FixPoint sqrt_fp = FixPoint.Sqrt(fp);
            Assert.Equal((int)sqrt_fp, i);
        }

        System.Random ran = new System.Random();
        for (int i = 0; i < 10000; ++i)
        {
            double   term         = (double)ran.NextDouble() * int.MaxValue;
            double   sqrt_term    = Math.Sqrt(term);
            FixPoint fp_sqrt_term = (FixPoint)sqrt_term;
            FixPoint fp           = (FixPoint)term;
            FixPoint sqrt_fp      = FixPoint.Sqrt(fp);
            Assert.Equal((double)sqrt_fp, sqrt_term);
            Assert.Equal(sqrt_fp, fp_sqrt_term);

            //decimal delta = (decimal)Math.Abs(sqrt_term - (double)sqrt_fp);
            //decimal precision_times = delta / FixPoint.Precision;
            //decimal delta_percent = delta * 100.0m / (decimal)term;
            //if (precision_times > m_max_precision_times)
            //    m_max_precision_times = precision_times;
            //if (delta_percent > m_max_delta_percent)
            //    m_max_delta_percent = delta_percent;
        }

        Console.WriteLine("TestSqrt() m_max_precision_times = " + m_max_precision_times + ", m_max_delta_percent = " + m_max_delta_percent);

        m_max_precision_times = 0m;
        m_max_delta_percent   = 0m;
        max_int = (int)Math.Sqrt((double)(int.MaxValue / 2));
        for (int i = 0; i < 10000; ++i)
        {
            double   term1       = (double)ran.NextDouble() * max_int;
            double   term2       = (double)ran.NextDouble() * max_int;
            double   distance    = Math.Sqrt(term1 * term1 + term2 * term2);
            FixPoint fpterm1     = (FixPoint)term1;
            FixPoint fpterm2     = (FixPoint)term2;
            FixPoint fp_distance = FixPoint.FastDistance(fpterm1, fpterm2);

            decimal delta         = (decimal)Math.Abs(distance - (double)fp_distance);
            decimal delta_percent = delta * 100.0m / (decimal)distance;
            if (delta_percent > m_max_delta_percent)
            {
                m_max_delta_percent = delta_percent;
            }
        }

        Console.WriteLine("FastDistance() m_max_delta_percent = " + m_max_delta_percent);
    }
Ejemplo n.º 3
0
    public void TestSqrt()
    {
        m_max_precision_times = 0m;
        m_max_delta_percent   = 0m;
        int max_int = (int)(Math.Sqrt((double)(int.MaxValue)));

        for (int i = 0; i < max_int; ++i)
        {
            int      value   = i * i;
            FixPoint fp      = new FixPoint(value);
            FixPoint sqrt_fp = FixPoint.Sqrt(fp);
            Assert.Equal((int)sqrt_fp, i);
        }

        System.Random ran = new System.Random();
        for (int i = 0; i < 10000; ++i)
        {
            double   term      = (double)ran.NextDouble() * int.MaxValue;
            double   sqrt_term = Math.Sqrt(term);
            FixPoint fp        = (FixPoint)term;
            FixPoint sqrt_fp   = FixPoint.Sqrt(fp);

            decimal delta           = (decimal)Math.Abs(sqrt_term - (double)sqrt_fp);
            decimal precision_times = delta / FixPoint.Precision;
            decimal delta_percent   = delta * 100.0m / (decimal)term;
            if (precision_times > m_max_precision_times)
            {
                m_max_precision_times = precision_times;
            }
            if (delta_percent > m_max_delta_percent)
            {
                m_max_delta_percent = delta_percent;
            }
        }

        Console.WriteLine("TestSqrt() m_max_precision_times = " + m_max_precision_times + ", m_max_delta_percent = " + m_max_delta_percent);
    }
Ejemplo n.º 4
0
 public FixPoint Length()
 {
     return(FixPoint.Sqrt(x * x + y * y + z * z));
 }
Ejemplo n.º 5
0
        public virtual FixPoint Evaluate(IExpressionVariableProvider variable_provider)
        {
            Stack <FixPoint> stack = new Stack <FixPoint>();
            FixPoint         var1, var2, var3;
            int index = 0;
            int total_count = m_instructions.Count;

            while (index < total_count)
            {
                OperationCode op_code = (OperationCode)m_instructions[index];
                ++index;
                switch (op_code)
                {
                case OperationCode.PUSH_NUMBER:
                    stack.Push(FixPoint.CreateFromRaw(m_instructions[index]));
                    ++index;
                    break;

                case OperationCode.PUSH_VARIABLE:
                    if (variable_provider != null)
                    {
                        var1 = variable_provider.GetVariable(m_variables[(int)m_instructions[index]], 0);
                        stack.Push(var1);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    ++index;
                    break;

                case OperationCode.NEGATE:
                    var1 = stack.Pop();
                    stack.Push(-var1);
                    break;

                case OperationCode.ADD:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 + var2);
                    break;

                case OperationCode.SUBTRACT:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 - var2);
                    break;

                case OperationCode.MULTIPLY:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 * var2);
                    break;

                case OperationCode.DIVIDE:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 / var2);
                    break;

                case OperationCode.SIN:
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Sin(var1));
                    break;

                case OperationCode.COS:
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Cos(var1));
                    break;

                case OperationCode.TAN:
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Tan(var1));
                    break;

                case OperationCode.SQRT:
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Sqrt(var1));
                    break;

                case OperationCode.MIN:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Min(var1, var2));
                    break;

                case OperationCode.MAX:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Max(var1, var2));
                    break;

                case OperationCode.CLAMP:
                    var3 = stack.Pop();
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(FixPoint.Clamp(var1, var2, var3));
                    break;

                case OperationCode.EQUAL:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 == var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.NOT_EQUAL:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 != var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.GREATER:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 > var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.GREATER_EQUAL:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 >= var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.LESS:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 < var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.LESS_EQUAL:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 <= var2)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.AND:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 != FixPoint.Zero && var2 != FixPoint.Zero)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.OR:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 != FixPoint.Zero || var2 != FixPoint.Zero)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.NOT:
                    var1 = stack.Pop();
                    if (var1 == FixPoint.Zero)
                    {
                        stack.Push(FixPoint.One);
                    }
                    else
                    {
                        stack.Push(FixPoint.Zero);
                    }
                    break;

                case OperationCode.AND_BITWISE:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 & var2);
                    break;

                case OperationCode.OR_BITWISE:
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    stack.Push(var1 | var2);
                    break;

                case OperationCode.CONDITIONAL_EXPRESSION:
                    var3 = stack.Pop();
                    var2 = stack.Pop();
                    var1 = stack.Pop();
                    if (var1 != FixPoint.Zero)
                    {
                        stack.Push(var2);
                    }
                    else
                    {
                        stack.Push(var3);
                    }
                    break;

                default:
                    break;
                }
            }
            return(stack.Pop());
        }