為什麼很多程序無法計算負數的立方根?

比如 (?8) ** (1/3) = ?2,用 Fortran 編程算只能得到 NaN。我知道如果輸入 y = (x / sqrt(x ** 2)) * (sqrt(x ** 2)) ^ (1/3),不管 x 是負數還是正數,都能返回其正確的立方根。但是為什麼電腦不能直接計算呢?


Excel里:

Fortran不了解,抱歉。

不支持也很正常,很多語言對開立方以上本身就不內置,只內置個開平方功能。

編程語言只內置常用的東西。


這麼說吧,(-8)**(1/3)=-2這個式子在數學中嚴格上是錯誤的。

因為這只是三個立方根中的一個,還有另外兩個是複數——

2*(cos(pi/3)+i*sin(pi/3));2*(cos(-pi/3)+i*sin(-pi/3));

而-2在這種形式下的寫法是2*(cos(pi)+i*sin(pi)),由於sin(pi)=0,也就是虛部為0,所以就是實數。

也就是說:-8的立方根結果不唯一,而且涉及到複數。

excel算純實根也是可以的

NaN=Not a Number,來源於1980年Intel公司,1985年被IEEE754標準收錄。詳見https://zh.wikipedia.org/wiki/IEEE_754


因為大多數編程語言的浮點數格式和相關運算遵循 IEEE 754 標準。IEEE 754 規定了 pow(x, y) 運算在 x 為 finite(即不是正負無窮大和NaN)且 x &< 0,而 y 是 finite 且不是整數時,返回 NaN。

由於 IEEE 754 標準文本是需要收費購買的,所以我也無法給出權威引用。不過可以參考各編程語言的規範,如:

ECMAScript 規範(http://es5.github.io/#x15.8.2.13)

Go 語言數學庫(http://golang.org/pkg/math/#Pow)

至於 IEEE 754 為何這樣設定 pow 運算的規則,得找那些參與制定標準的數學工程計算領域的專家才能得到權威解答了。


我也用maxima算了一下。


MATLAB出來這個:供參考


推薦閱讀:

通過把演算法導論的偽代碼抄成自己喜歡的語言來學習使用演算法對大家來說是不是足夠容易?
LSM 演算法的原理是什麼?
B站有沒有用推薦演算法啊?
演算法題目中,遇到結果是大數時,為什麼喜歡 MOD 10^x+7 ?
為什麼說遞歸效率低?

TAG:演算法 | 數學 | 計算機科學 | CC |