public static FInt Sqrt(FInt f, int NumberOfIterations) { if (f.RawValue < 0) //NaN in Math.Sqrt throw new ArithmeticException("Input Error"); if (f.RawValue == 0) return (FInt)0; var k = (f + FInt.OneF) >> 1; for (var i = 0; i < NumberOfIterations; i++) k = (k + (f / k)) >> 1; if (k.RawValue < 0) throw new ArithmeticException("Overflow"); else return k; }
public static FInt Asin(FInt F) { var isNegative = F < 0; F = Abs(F); if (F > FInt.OneF) throw new ArithmeticException("Bad Asin Input:" + F.ToDouble()); var 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); var f2 = (PI / FInt.Create(2, true)) - (Sqrt(FInt.OneF - F) * f1); return isNegative ? f2.Inverse : f2; }
public static FInt Atan2(FInt F1, FInt F2) { if (F2.RawValue == 0 && F1.RawValue == 0) return (FInt)0; var result = (FInt)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) / FInt.Create(2, true); return result; }
public static FInt Sin(FInt i) { var j = (FInt)0; for (; i < 0; i += FInt.Create(25736, false)) ; if (i > FInt.Create(25736, false)) i %= FInt.Create(25736, false); var 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; }
private static FInt mul(FInt F1, FInt F2) { return F1 * F2; }
public static FInt Abs(FInt F) { if (F < 0) return F.Inverse; else return F; }
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)); }
public static FPoint Create(FInt X, FInt Y) { FPoint fp; fp.X = X; fp.Y = Y; return fp; }
public static FInt operator >>(FInt one, int Amount) { return FInt.Create(one.RawValue >> Amount, false); }