Результаты возведения в степень perl в "nan" - PullRequest
2 голосов
/ 06 сентября 2011

у меня следующая проблема: У меня есть несколько значений x, и мне нужно вычислить x ^ e (e это число Эйлера). Я делаю это:

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

Это приводит к "nan" для всех моих тестовых случаев.

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

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

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

Кто-нибудь может указать, что я здесь не так делаю?

Спасибо

PS: Возможно, ошибка скрывается где-то еще, поэтому вот как я вычисляю $ x:

$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"

Ответы [ 2 ]

12 голосов
/ 06 сентября 2011

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

$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);

И, должно быть, не существует действительного числа, соответствующего этому критерию.

6 голосов
/ 06 сентября 2011

Давайте немного упростим ситуацию и предположим, что мы принимаем $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)?

...