Mathematica不知道0乘以任何數等於0嗎?

0*(10^8)!

就這個簡單的例子,還得算上一會兒,而不是瞬間得到結果,是不是說明它還不夠智能呢?


0*ComplexInfinity還真不是0,是Indeterminate!不能這麼瞎搞的!

理論上就是 @happy fish 的那個答案,實際上舉個例子:

0*(1/0)
0*(10^8)!

乘數都得算下才能知道啥性質,假如是ComplexInfinity的話就得給出Indeterminate,假如是個正常的數就給出0對吧。不算下乘數怎麼能知道給出啥結果呢?假如要算乘數,乘數那麼大,當然要點時間啊!你要所謂的「智能」,自己寫個:

Attributes[MyTimes] = HoldAllComplete;
MyTimes[expr:(Except[0]...)]:=Times[expr];
MyTimes[___]:=0

運算也要根據基本法,按順序來!不能亂算的!

對於一個嚴謹的語言,而不是像matlab里的那個什麼計算器,規律重於這一點點trick……君不知這裡不運算會出多少bug……

再來個例子(其實不管怎麼改都能找出bug來的):

A:=1/0
A*0

請問你是算不算A呢?Matlab裡面不需要考慮類似的問題,因為語言結構根本就不一樣,而且它壓根就沒被看成一種能用的語言,只是個弱功能計算器罷了。

在mma里所有表達式都是同構的,所以涉及到底層函數的時候,最好還是別開特例------總會出bug。


Mathematica對於自己的evaluation order有明確的設計。首先表達式變成Times[0, (10^8)!],然後由於Times函數沒有Hold相關屬性,arguments先被執行,於是(10^8)!先運算,結果再乘以0.

所以說還是要先去學習documentation,並且也別拿一個明顯錯誤的命題來問。


確實不夠智能,說沒有Hold只能算是把不夠智能的原因解釋了一下,並不能迴避「不夠智能」這個結果

就好像有人說一個手機拍照不行,你說「不是他拍照不行,是因為他攝像頭只有30萬像素」一樣奇怪

就拿符號計算基本殘廢的matlab來說:

sym(0)*factorial(sym(10^8))

就是秒出0

sym(0)*sym(inf)

一樣是秒出nan

當然你可能找出很多理由mma這樣設計比matlab這樣設計的好處,但是不能否認它在這個具體案例上確實「不夠智能」的表現


一般函數調用的時候都是 Call by value, So...

強制 Call by name 可以通過 Hold[]ReleaseHold[] 做到

可以自己看文檔

Evaluation of Expressions?

reference.wolfram.com


推薦閱讀:

Solve函數計算的結果為什麼不能分步轉換成函數?
你對即將發布的 Mathematica 11 有什麼期待?
Mathematica 做數值計算時有哪些方式可以達到提速的目的?
Mathematica、Maple等符號計算軟體今後會不會徹底取代紙筆推導?
Mathematica如何導入某個csv或者excel文件的指定行和列?

TAG:WolframMathematica |