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)); }
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); }
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); }
public FixPoint Length() { return(FixPoint.Sqrt(x * x + y * y + z * z)); }
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()); }