perl取幂导致“nan”

时间:2011-09-06 15:47:01

标签: perl number-formatting

我有以下问题: 我有许多值x,我需要计算x ^ e(e是euler的数字)。 我这样做:

$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 个答案:

答案 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);

它应该,没有符合此标准的实数。

答案 1 :(得分: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.5sqrt($x)的五次幂相同。

由于计算机默认情况下只会处理实数,如果$x==-1说出来会怎么想?

是啊....现在,如果$x<0$并且我们想采用$x**exp(1)(Perl用于exp(1)的十进制近似值是2.71828182845905)会怎样?