Как извлечь корень из отрицательного числа? Например, результатом выражения Math.Pow(-8, 1.0/3)
будет NaN
, хотя должно быть -2
.
Согласно документации, при конечном отрицательном основании и конечном нецелом показателе результат равен 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;
// результат действительный, работайте с ним
}
интересует именно то, как решается эта задача
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 кубических корня: один действительный (отрицательный) и два мнимых, с одинаковым комплексным модулем. Число 2 не является кубическим корнем из -8, это значение комплексного модуля для его корней. Если вам нужно найти его действительный корень (-2), используйте комплексную арифметику:
var result = - System.Numerics.Complex.Pow(-8, 1.0 / 3).Magnitude;
Прогаю на С# в Unity, нередко используя команды препроцессора #if/#endif, #region/#endregion и прочие
Мне нужно создать приложение, которое в фоне выполняет различные действия, и при определённом условии создало форму, показало там что-то...
Есть одна ContentPage и две ViewModelДля всей страницы целиком указан BindingContext к ViewModel1, но часть элементов внутри некоторой StackLayout нужно забиндить к ViewModel2