Я относительно новичок в С#, и поскольку Math.Pow(x, y) возвращает NaN для отрицательного числа (читай: не отрицательная мощность), я хочу знать, как вычислять результат более эффективно. То, что я пишу сейчас, является базовым для цикла, но я хочу знать, можно ли его реализовать короче (используя Linq, возможно)?
for(int i=0;i<power;i++)
{
result = result * num;
}
Math.Pow(x,y)
возвращаетNaN
для отрицательного числа.
Это потому, что произвольное возведение в степень не определено для отрицательной базы:
http://en.wikipedia.org/wiki/Exponentiation
когда база b является положительным вещественным числом, b для n может быть определена для всех вещественных и четных комплексных индексов n через экспоненциальную функцию
Теперь возведение в степень отрицательных чисел для получения реального результата определяется, если мощность является целым числом, как в вашем случае, но Pow
не рассчитает ее для вас. Что вам нужно сделать:
Pow(-2, 5)
Pow
проблему Pow(2, 5)
. Таким образом, в этом случае Pow(2, 5)
возвращает 32. Показатель 5 нечетный, поэтому сделайте его -32, и все готово.
в Pow (двойное основание, двойная мощность), когда base <0 и мощность дробная (например: мощность = 0,5), тогда NaN будет сгенерирован, потому что он вычисляется в сложной области, а не в реальной области. так что вам может потребоваться проверить базу и мощность функции pow перед их использованием. в этом случае вы должны вернуть желаемое значение как неопределенное значение (вместо NaN).
нижняя функция выполняет эту операцию и возвращает 0 вместо NaN:
// pow with desired Nan
public double Pow(double x,double y){
double MyNaN = 0; // or any desired value for Nan
double result = MyNaN;
if (Math.Floor (y) != y) { // if y is fractional number
if (x < 0) // if x is negative number
return result;
}
result = Math.Pow (x, y);
return result;
}
Я думаю, вы можете использовать System.Numerics.Complex, который может вычислить Imaginary.
http://www.extremeoptimization.com/QuickStart/CSharp/ComplexNumbers.aspx
https://www.codeproject.com/Tips/3370/Complex-Math-Library-for-Csharp-and-VB-NET
Pow(-2, 5)
возвращает-32
- dotnetfiddle.net/ks8ObKdouble a = -2, b = 4.999999999999999; Console.WriteLine("{0}^{1} = {2}", a, b, Math.Pow(a, b));
печатает "-2 ^ 5 = NaN".