使用了MathNet库中的一种方法,并尝试应用其三次求根函数,但它输出的小数非常长,四舍五入似乎不会影响它们。
public static (Complex, Complex, Complex) FindCubic(double a, double b, double c, double d)
{
double num = b * b - 3.0 * a * c;
double num2 = 2.0 * b * b * b - 9.0 * a * b * c + 27.0 * a * a * d;
double num3 = -1.0 / (3.0 * a);
if ((num2 * num2 - 4.0 * num * num * num) / (-27.0 * a * a) == 0.0)
{
if (num == 0.0)
{
Complex complex = new Complex(num3 * b, 0.0);
return (complex, complex, complex);
}
Complex complex2 = new Complex((9.0 * a * d - b * c) / (2.0 * num), 0.0);
Complex item = new Complex((4.0 * a * b * c - 9.0 * a * a * d - b * b * b) / (a * num), 0.0);
return (complex2, complex2, item);
}
(Complex, Complex, Complex) tuple = ((num == 0.0) ? new Complex(num2, 0.0).CubicRoots() : ((num2 + Complex.Sqrt(num2 * num2 - 4.0 * num * num * num)) / 2.0).CubicRoots());
return (num3 * (b + tuple.Item1 + num / tuple.Item1), num3 * (b + tuple.Item2 + num / tuple.Item2), num3 * (b + tuple.Item3 + num / tuple.Item3));
}
上面的代码运行良好,但确实不确定如何缩短结果中的小数。例如,如果理论上输出应该是(-1,0)(它在大多数计算器上确实显示了这一点),那么它会显示(-1,-2.0354088784794536E-16),这接近于0,并且
应该是
显示为0。
Round(num3, 0) * (b + new Complex (Round(tuple.Item1.Real, 0), Round(tuple.Item1.Imaginary, 0)) + num / tuple.Item1)
有问题的舍入代码,因为您不能直接对复数进行舍入。
在评论中解决:忘记了浮点不准确。