Рассчитать мощность отрицательного числа

1

Я относительно новичок в С#, и поскольку Math.Pow(x, y) возвращает NaN для отрицательного числа (читай: не отрицательная мощность), я хочу знать, как вычислять результат более эффективно. То, что я пишу сейчас, является базовым для цикла, но я хочу знать, можно ли его реализовать короче (используя Linq, возможно)?

for(int i=0;i<power;i++)
       {
           result = result * num;
       }
Теги:
linq

3 ответа

4
Лучший ответ

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, и все готово.

  • 1
    Я не понимаю Pow(-2, 5) возвращает -32 - dotnetfiddle.net/ks8ObK
  • 0
    @Vedanshu Одна вещь, которая может вызвать это, если ваш показатель не является целым числом, но настолько близок к целому числу, что вы не замечаете, что это не так. double a = -2, b = 4.999999999999999; Console.WriteLine("{0}^{1} = {2}", a, b, Math.Pow(a, b)); печатает "-2 ^ 5 = NaN".
0

в 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;

}
-1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню