0

好的,所以我在这里执行了一个烦人的数学计算,试图求解一个立方根。

现在,这是我的 C# 代码:

public void CubeCalculate()
{
    //Calculate discriminant

    double insideSquareRoot = (18 * cubicAValue * cubicBValue * cubicCValue * cubicDValue) + (-4 * (Math.Pow(cubicBValue, 3) * cubicDValue) + (Math.Pow(cubicBValue, 2) * Math.Pow(cubicCValue, 2)) + (-4 * cubicAValue * Math.Pow(cubicCValue, 3)) + (-27 * Math.Pow(cubicAValue, 2) * Math.Pow(cubicDValue, 2)));

    if (insideSquareRoot < 0)
    {
        //One real solution, two imaginary
        double onecuberootradical1 = (1 / 2) * (((2 * Math.Pow(cubicBValue, 3)) + (-9 * cubicAValue * cubicBValue * cubicCValue) + (27 * Math.Pow(cubicAValue, 2) * cubicDValue)) + (Math.Sqrt(Math.Pow((2 * Math.Pow(cubicBValue, 3)) + (-9 * cubicAValue * cubicBValue * cubicCValue) + (27 * Math.Pow(cubicAValue, 2) * cubicDValue), 2) + (-4 * Math.Pow(Math.Pow(cubicBValue, 2) + (-3 * cubicAValue * cubicCValue), 3)))));
        double onecuberootradical2 = (1 / 2) * (((2 * Math.Pow(cubicBValue, 3)) + (-9 * cubicAValue * cubicBValue * cubicCValue) + (27 * Math.Pow(cubicAValue, 2) * cubicDValue)) - (Math.Sqrt(Math.Pow((2 * Math.Pow(cubicBValue, 3)) + (-9 * cubicAValue * cubicBValue * cubicCValue) + (27 * Math.Pow(cubicAValue, 2) * cubicDValue), 2) + (-4 * Math.Pow(Math.Pow(cubicBValue, 2) + (-3 * cubicAValue * cubicCValue), 3)))));
        x1 = (-cubicBValue / (3 * cubicAValue)) + ((-1 / (3 * cubicAValue)) * (Math.Pow(onecuberootradical1, 1 / 3))) + (-1 / (3 * cubicAValue) * Math.Pow(onecuberootradical2, 1 / 3));
        x2 = double.NaN;
        x3 = double.NaN;
    }

好的,我想弄清楚这里出了什么问题。

首先,由于这是 MVC 应用程序的一部分,我已经确保我的其他根工作正常,所以这纯粹是以下计算的错误,而不是其他任何地方的问题。

现在,我在这里检查了很多次,我没有发现任何问题。

您可以在此处与正确的公式进行比较: 替代文字

这是x1我试图在这里复制的根。

此外,如果您想了解同一篇维基百科文章的官方判别式,请点击此处:

替代文字

大家有没有看错???

4

2 回答 2

9

这里很明显:

(1 / 2)

当您应该使用浮点数时,您正在那里执行整数除法:

(1 / 2.0)

你没有向我们展示你的cubic*Value 变量的声明,所以我假设它们是双精度数。

于 2010-10-30T23:37:41.797 回答
1

这是或应该是常见问题之一,答案是:每个计算机科学家应该知道的关于浮点运算的知识(链接

于 2010-10-30T23:40:52.017 回答