我有以下问题: 我有许多值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"
答案 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.5
与sqrt($x)
的五次幂相同。
由于计算机默认情况下只会处理实数,如果$x==-1
说出来会怎么想?
是啊....现在,如果$x<0$
并且我们想采用$x**exp(1)
(Perl用于exp(1)
的十进制近似值是2.71828182845905
)会怎样?