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

195
20 октября 2018, 17:10

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

Answer 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;
    // результат действительный, работайте с ним
}
Answer 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);
}
Answer 3

Отрицательные числа имеют 3 кубических корня: один действительный (отрицательный) и два мнимых, с одинаковым комплексным модулем. Число 2 не является кубическим корнем из -8, это значение комплексного модуля для его корней. Если вам нужно найти его действительный корень (-2), используйте комплексную арифметику:

var result = - System.Numerics.Complex.Pow(-8, 1.0 / 3).Magnitude;
READ ALSO
#DEFINE в C# (Unity)

#DEFINE в C# (Unity)

Прогаю на С# в Unity, нередко используя команды препроцессора #if/#endif, #region/#endregion и прочие

154
Анимация движения элемента [дубликат]

Анимация движения элемента [дубликат]

На данный вопрос уже ответили:

184
Создать и удалить форму C#

Создать и удалить форму C#

Мне нужно создать приложение, которое в фоне выполняет различные действия, и при определённом условии создало форму, показало там что-то...

187
Xamarin.Forms указание BindingContext через XAML

Xamarin.Forms указание BindingContext через XAML

Есть одна ContentPage и две ViewModelДля всей страницы целиком указан BindingContext к ViewModel1, но часть элементов внутри некоторой StackLayout нужно забиндить к ViewModel2

158