VB與Excel在乘冪運算時的結果差異及其不合理性
來源:互聯網
上載者:User
excel|運算 東北林業大學環境科學系 隋祥
引言
運算式解析是編程工具與試算表等軟體最基本的功能之一,不同的軟體在解析運算式時都遵循一定的運算規則,在不同軟體中,這些運算規則略有差異,導致計算結果也不同。筆者在實踐中發現,VB與Excel在處理“連續乘冪”這一常見運算時,所遵循的法則有著較大的出入,而且都存在著不合理的因素。本文試圖通過論述得到一種更為合理的運算模式,並為編寫運算式解析類過程提供指導。
問題分析
下表列出了VB6.0與Excel2003在處理同一個關於乘方運算的運算式時所得到的結果。
表1 VB6.0與Excel2003執行乘方運算的結果差異
運算式
VB計算結果
Excel計算結果
2^-2^-2
.840896415253715
16
-2 ^ 2
-4
4
-2^-2^-2
-.840896415253715
16
2 ^ -3 ^ 4 ^ 7
0
5.16988E-26
本人經過分析,認為引起結果差異的主要因素是單目運算子“-”的運算級和連續乘冪的運算順序。詳細分析如下:
1.對於運算式2^-2^-2,VB的計算步驟是2^(-2^-2)= .840896415253715,這時它的計算順序是從右至左,而Excel則嚴格按照從左至右的結合順序。如果我們把2^-2^-2理解為,那麼,顯然VB的計算結果是合理的,但是不是VB在處理連續乘方運算時都是從右至左的呢?答案是否定的。在計算2^3^4時,VB得到的結果是4096而不是2.41785163922926E+24,這說明此時VB並沒有把2^3^4理解為而是理解為,是從左至右的結合順序。顯然,VB在處理乘方運算時,其結合順序沒有一個令人信服的依據,並存在不合理性。
2.對於運算式-2^2,VB的計算過程相當於-(2^2)=-4,按照Microsoft MSDN 6.0 簡體中文版VB協助系統中的《運算子優先順序》一文中的描述,指數運算子(^)高於負數運算子(-)。這樣看來VB按照這樣的法則得到這樣的結果是合理的。對於Excel,它的計算過程相當於(-2)^2,按照Excel 2003版協助文檔的敘述,符號(-)要高於乘冪(^)(註:兩款軟體運算子的中文名稱略有差異),那麼這樣看來Excel的運算也是合理的。但是Excel將“-(負號)”的優先順序放在“^”運算子之前的做法存在著一定問題。例如對於運算式4-2^2、4--2^2、4---2^2、4-……-(n個-)2^2的結果都是0,這是按照上述法則令人無法順利解釋的。
3.由於上述兩條原因才導致了對於運算式-2^-2^-2的計算結果的不同。
4. 對於運算式2 ^ -3 ^ 4 ^ 7,VB計算結果為0,這是無論如何也無法順利解釋的。關於此結果的來曆還有待於進一步研究。
運算式解析法則建議
鑒於VB與Excel在解析運算式時對乘冪運算的結果差異及所存在的不合理性,建議在編寫運算式解析過程時應當遵循如下原則:
1.建議將乘冪運算子“^”的優先順序至於單目負數運算子“-”之前。
2.在連乘冪運算的結合順序上應當統一,建議採用從左至右的結合方式。