2011-09-06 3 views
2

У меня проблема: У меня есть ряд значений x, и мне нужно вычислить x^e (e - число Эйлера). Я делаю это:perl exponentiation results in "nan"

$x = $x ** exp(1); 

Это приводит к «нан» для всех моих тестов.

Однако если напечатать значения $ х, прежде чем я это сделать, а затем принять одно и изменить выше линии к этому:

$x = -12.4061063212051 ** exp(1); 

это приводит к совершенно прекрасных номеров.

Может ли кто-нибудь указать, что я делаю неправильно здесь?

Благодаря

PS: Может быть, ошибка прячется где-то еще, так вот как я вычислить $ х:

$y = #some float value taken from the output string of another program 
$x = ($y/(303 * 0.0019872041)); 
print $x; #prints number 
$x = $x ** exp(1); 
print $x; #prints "nan" 
+3

please me that 'x $' не является опечаткой в ​​вашем коде: D –

+0

: D нет, конечно нет! спасибо – Nick

+0

вы уверены, что '$ x' не NaN до этого? – Mat

ответ

6

Давайте сделаем вещи немного легче на данный момент, и предположим, что мы принимали $x**2.5. Ну, с 2.5==5.0/2.0, у нас есть $x**2.5==$x**(5.0/2.0)==($x**0.5)**5.0. Или, другими словами, $x**2.5 - это то же самое, что и пятая мощность sqrt($x).

Поскольку компьютеры по умолчанию имеют дело только с действительными числами, что, по вашему мнению, произойдет, если, скажем $x==-1?

Да .... теперь, что если $x<0$ и мы хотели взять $x**exp(1) (десятичное приближение, которое использует Perl для exp(1) является 2.71828182845905)?

+1

ok Я вижу это сейчас! Спасибо за объяснение! – Nick

+0

Добро пожаловать. :) –

12

Это все о приоритете операций:

$x = -12.4061063212051 ** exp(1); 

действительно

$x = - (12.4061063212051 ** exp(1)); 

, как видно, используя

$ perl -MO=Deparse,-p -e'$x = -12.4061063212051 ** $e' 
($x = (-(12.4061063212051 ** $e))); 
-e syntax OK 

Это хорошо.

Если попробовать следующее будет также не только в качестве программы:

$x = (- 12.4061063212051) ** exp(1); 

И он должен, не действительное число, которое отвечает этим критериям.

+0

Приоритет был неожиданным, поэтому я добавил код демонстрировать. Надеюсь, вы не против. – ikegami

+0

отлично, спасибо! –