MathNet库三次根求解复数结果显示极小小数的处理问题
三次根求解的浮点数精度问题处理
我使用MathNet库中的三次根求解函数时,发现输出结果带有超长小数,尝试手动取整也无法改善。比如理论上应为(-1, 0)的结果,实际显示为(-1, -2.0354088784794536E-16)。
我试过针对复数实部和虚部分别取整的代码:
Round(num3, 0) * (b + new Complex (Round(tuple.Item1.Real, 0), Round(tuple.Item1.Imaginary, 0)) + num / tuple.Item1)
后来在评论里找到问题根源——忽略了浮点数精度误差。
以下是我用到的三次根求解函数代码:
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)); }
内容的提问来源于stack exchange,提问作者user21161268
相关产品推荐
相关产品推荐

