public static Type Root(dynamic number, int root) where Type : struct { const double epsilon = 1e-10; // Tolerance level for convergence Type guess = (Type)Convert.ChangeType(number / root, typeof(Type)); // Initial guess while (Absolute(Power(guess, root) - number) > epsilon) { guess = (Type)Convert.ChangeType(((dynamic)(root - 1) * (dynamic)guess + (dynamic)number / Power((dynamic)guess, root - 1)) / root, typeof(Type)); } return guess; }