Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Извлечь корень из отрицательного числа

#c_sharp


Как извлечь корень из отрицательного числа? Например, результатом выражения Math.Pow(-8,
1.0/3) будет NaN, хотя должно быть -2.
    


Ответы

Ответ 1



Согласно документации, при конечном отрицательном основании и конечном нецелом показателе результат равен NaN. Это значит, что Math.Pow ведёт себя не совсем так, как стандартная математическая степень, и вам придётся самим обрабатывать случай отрицательного основания. Почему так сделано? Думаю, потому, что дроби наподобие 1/3 нельзя представить точно значением типа double. Поскольку в случае чётного знаменателя результат получается комплексным, мы видим, что малая ошибка в показатели степени ведёт к большой ошибке в результате. Поэтому разумным было бы просто не пытаться подсчитать результат для таких вот случаев. Хорошо, а как решать задачу по извлечению корня целой степени? Ну просто анализируйте знак. int rootpower = 3; double value = -8; int sign = Math.Sign(value); double absRoot = Math.Pow(Math.Abs(value), 1.0/rootpower); if (rootpower % 2 == 0 && sign == -1) { Complex root = Complex.ImaginaryOne * absRoot; // результат комплексный, работайте с ним } else { double root = sign * absRoot; // результат действительный, работайте с ним }

Ответ 2



интересует именно то, как решается эта задача double Root(double base, int degree) { if (base < 0 && degree % 2 == 1) return -Math.Pow(Math.Abs(base), 1.0 / degree); else return Math.Pow(base, 1.0 / degree); }

Ответ 3



Отрицательные числа имеют 3 кубических корня: один действительный (отрицательный) и два мнимых, с одинаковым комплексным модулем. Число 2 не является кубическим корнем из -8, это значение комплексного модуля для его корней. Если вам нужно найти его действительный корень (-2), используйте комплексную арифметику: var result = - System.Numerics.Complex.Pow(-8, 1.0 / 3).Magnitude;

Комментариев нет:

Отправить комментарий