2012-04-22 3 views
-1

Итак, я собрал от this question, что, когда вы берете pow() с отрицательным числом с нецелым показателем, результатом является NaN.Вычисление отрицательного числа с отрицательным числом до нецелого показателя

Так что мой вопрос: есть ли альтернативный метод, который я могу использовать для получения ответа? Я просто хочу иметь возможность делать такие вещи:

MyPowFunction(-3125, 0.2); 

и иметь результат (правильно) -5.

Любые мысли?


В качестве дополнения, это возможно сделать это (то). Google имеет выясняли: https://www.google.com/search?q=%28-3125%29%5E0.2&oq=%28-3125%29%5E0.2


Один больше примечание: Я не заинтересован в двойной результат - я прекрасно с результатом является сложным.

+0

Ницца. И что должно быть «MyPowFunction (-1, 0.1)»? – Vlad

+0

В идеале, '0.951056516 + 0.309016994 i' – riwalk

+0

(я не сказал, что мне нужен двойной - я хочу, чтобы он был направлен в правильном направлении, чтобы найти правильный математически правильный ответ) – riwalk

ответ

4

Если a является положительным и b является (комплексным) произвольным, то можно определить a^b как exp (b log a). Это непосредственно распространяется на случай, когда b - рациональное число.

Теперь, если сложный (но отлична от нуля), то можно определить^Ь на аналогия (правильного термина «аналитическое продолжение») как ехр (Ь Log а), где Log является один возможный обратный of exp.

Например, одна из возможных функций входа (там infintely много, отличающиеся на величину, кратную 2 я пи) является

Log z = log |z| + i(arg z + 2k pi), k as you wish 

Убедитесь, что для любого к, это дает обратный ехр (я пропущу подробности о области определения: просто притворимся, что существует только один z, и мы хотим найти Log z такой, что exp (Log z) = z).

Способ, которым вы выбираете k, будет таким образом влиять на ответ. Если б иррационально, то

"a^b" = exp(b Log a) = exp(ib arg a) * exp(2i k pi * b) * |a| 

и поскольку к может быть произвольным, ехр (2i к р * б) может быть сколь угодно близко к тому, что число, которое вы хотите на единичной окружности (единичной окружности = числа с единичным модулем) , существует бесконечно много значений «а^Ь».

Если b является рациональным (например, 0.2 = 1/5 в вашем примере), вы получите 5 разных кандидатов для^0,2 (один из которых является реальным).

+1

Замечательное объяснение. Понятно, что мне есть чему поучиться, и этот ответ пытается «объяснить», а не просто «рассказывать», – riwalk

2

Беда в том, что -5 является не «математически правильный ответ», по следующим причинам:

  • 0,2 не совсем 1/5. Вы на самом деле просите -3125 к 0.200000000000000011102230246251565404236316680908203125th мощности, которая имеет очень большое семейство решений.
  • Обычное математическое соглашение состоит в том, чтобы выбрать решение x^y, которое вы получаете от оценки exp (y * log (x)), где log (x) берется с ветвью, вырезанной на отрицательной вещественной оси. -3125 лежит на разрезе ветки, поэтому вам нужно решить, на какой стороне он включен. Конвенция должна поставить ее на позитивную сторону.
  • Даже если предположить, что 0.2 были представлены в плавающей точке, оценка вашего выражения в соответствии с соглашением дала бы результат 4.045084971874738 + 2.9389262614623664i, а не -5, как вы, кажется, ожидаете.
+0

-1. Я выбрал пример, который я сделал, потому что (-5)^5 = -3125. Мой вопрос представляет мою попытку найти 5-й корень из -3125. Интересный момент о точности, но если предположить, что он может быть представлен идеально, то он определенно имеет хотя бы один реальный ответ. – riwalk

+0

+1. Единственный верный ответ. @Stargazer, что вы считаете «пятым корнем из -3125», является лишь одним ответом между множеством различных определений корня. Наиболее общим определением является exp (y log (x)), где log (x) выбрано как главное значение Log x (обратите внимание, что в сложном случае для log (x) имеется множество вариантов выбора log (x)). Если вы хотите, чтобы калькулятор мог корректно обрабатывать эти случаи, используйте [wolfram-alpha] (http://www.wolframalpha.com/input/?i=%28-5%29^0.2) – Anthales

+0

@ Stargazer712: Если я предполагаю что федеральный бюджет США сбалансирован, тогда он сбалансирован. Это никому не выгодно использовать. Факт остается фактом, что 0.2 не является точно представимым, независимо от того, какие предположения вы готовы сделать. –

1

Приведение отрицательного числа в нецелую силу дает сложный результат. Вы можете использовать класс System.Numerics.Complex, доступный в .NET 4, для его расчета. Например:

using System; 
using System.Numerics; // Add reference to System.Numerics!! 

class Program { 
    static void Main(string[] args) { 
     var c = new Complex(-3125, 0); 
     var p = Complex.Pow(c, 0.2); 
     Console.WriteLine(p); 
     var result = p.Magnitude; 
     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 
} 

Выход:

(4.04508497187474, 2.93892626146237) 
5 

Заставить результат отрицательный будет требовать некоторые воображаемые воображаемые манипуляции. Значение result.Phase недостаточно велико, чтобы сделать его отрицательным в любой разумной проекции.

Смежные вопросы