perl取幂导致"nan"

Nik*_*sMM 2 perl number-formatting

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

$x = $x ** exp(1);
Run Code Online (Sandbox Code Playgroud)

这导致我的所有测试案例都"纳米".

但是,如果我在执行此操作之前打印$ x的值,然后取一个并将上面的行更改为:

$x = -12.4061063212051 ** exp(1);
Run Code Online (Sandbox Code Playgroud)

它会产生完美的数字.

谁能指出我在这里做错了什么?

谢谢

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"
Run Code Online (Sandbox Code Playgroud)

Kar*_*ath 12

这都是关于运算符优先级的:

$x = -12.4061063212051 ** exp(1);
Run Code Online (Sandbox Code Playgroud)

是真的

$x = - (12.4061063212051 ** exp(1));
Run Code Online (Sandbox Code Playgroud)

正如所见

$ perl -MO=Deparse,-p -e'$x = -12.4061063212051 ** $e'
($x = (-(12.4061063212051 ** $e)));
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

哪个好.

如果您尝试以下操作,它也会像您的程序一样失败:

$x = (- 12.4061063212051) ** exp(1);
Run Code Online (Sandbox Code Playgroud)

它应该,没有符合这个标准的实数.


小智 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)?