2011-09-06 62 views
2

我有以下問題: 我有許多值x,我需要計算x^e(e是euler的數字)。 我這樣做:perl指數結果爲「nan」

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

這將導致「南」爲我所有的測試用例。

但是,如果我打印的$ 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" 
+3

請讓我這是'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.5sqrt($x)的五次方相同。

由於電腦默認只處理實際的數字,所以如果$x==-1這樣的話會發生什麼?

啊....現在,如果$x<0$,我們要採取$x**exp(1)(即Perl使用了exp(1)2.71828182845905十進制近似值)是什麼?

+1

好吧我現在看到它!感謝您的解釋! – Nick

+0

不客氣。 :) – 2011-09-06 16:19:54

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

優秀,謝謝你! –