《高效程序的奧秘》(Henry S.Warren,Jr.著)第9章“整數除法”中說:
除法運算是一個復雜的過程,含有除法的算法通常都不很精巧。甚至連如何定義整數除法都是一個值得研究的問題。大多數高級語言和大多數計算指令集將其定義為有理數結果的向零截取。這一定義以及其他兩種可能的定義敘述如下:
--------- ---截取-- ---模--- --地板--
7 / 3 = 2 余 1 2 余 1 2 余 1
-7 / 3 = -2 余 -1 -3 余 2 -3 余 2
7 / -3 = -2 余 1 -2 余 1 -3 余 -2
-7 / -3 = 2 余 -1 3 余 2 2 余 -1
--------- --------- -------- --------
對于所有三種可能的定義,關系“被除數=商×除數+余數”都成立。在定義“模”(modulus)除法時,要求余數是非負數。在定義“地板”(floor)除法時,要求商是有理數除法的結果的“地板”。對于除數是正的情況,模除法和地板除法等價。很少使用的第四種可能定義是向最接近的整數舍入。
所以,“裝配腦袋”所說的“數學上規定”實際上是指“地板”除法。而現有的高級語言(如C、C++、C#、Java、Fortran、Ada、Pascal等)大多數都使用“截取”除法,IBM的PL.8語言使用“模”除法,Knuth的MMIX計算機的除指令使用“地板”除法。
[C#語言規范 7.7.2]中說:(整數)除法將結果舍入到零,并且結果的絕對值是小于兩個操作數的商的絕對值的最大可能整數。當兩個操作數符號相同時,結果為零或正;當兩個操作數符號相反時,結果為零或負。
posted on 2009-04-12 16:30
何克勤 閱讀(610)
評論(0) 編輯 收藏 所屬分類:
其他