#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;
Комментариев нет:
Отправить комментарий