Математический расчет C # не работает должным образом - PullRequest
0 голосов
/ 31 октября 2010

ОК, поэтому я выполняю здесь надоедливые математические вычисления, пытаясь найти один из кубических корней.

Теперь вот мой код 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, я убедился, что мои другие корни работают должным образом, так что это чисто ошибкаСледующее вычисление, нигде не проблема.

Теперь я много раз проверял здесь и не нашел ничего неправильного.

Вы можете сравнить с правильной формулой здесь: alt text

Это корень x1, который я пытаюсь воспроизвести здесь.

Кроме того, если вы хотите узнать официальный дискриминант из той же статьи той же Википедии вот оно:

alt text

Ребята, вы видите что-то не так ???

Ответы [ 2 ]

8 голосов
/ 31 октября 2010

Прямо здесь есть что-то очевидное:

(1 / 2)

Вы выполняете целочисленное деление там, где следует использовать число с плавающей запятой:

(1 / 2.0)

Вы не показываете нам объявление ваших кубических * переменных значения, поэтому я буду считать, что они являются двойными.

1 голос
/ 31 октября 2010

Это или должен быть один из часто задаваемых вопросов, и ответ таков: что должен знать каждый специалист по вычислительной технике об арифметике с плавающей запятой ( ссылка )

...