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 |