2013-10-22 83 views
18

整數除法-1/5應該返回什麼?我完全被這種行爲所困惑。我認爲它應該是0,但python和ruby返回-1。整數除負數

爲什麼不同的語言在這裏行爲不同?請有人解釋。謝謝。

| Language | Code   | Result | 
|-----------+----------------+--------| 
| ruby  | -1/5   |  -1 | 
| python | -1/5   |  -1 | 
| c   | -1/5   |  0 | 
| clojure | (int (/ -1 5)) |  0 | 
| emacslisp | (/ -1 5)  |  0 | 
| bash  | expr -1/5 |  0 | 
+0

是什麼問題?你不知道嗎?如果你想知道它的任何語言,試試吧? – usethedeathstar

+0

對不起,我的意思是-1而不是1.我不知道答案,我感到完全困惑。 – ivs

+9

沒有答案。 「整數除法」並不是一個明確定義的概念,每種語言的規範都可以選擇floor或截斷爲0作爲操作的定義結果。 – geoffspear

回答

31

簡短的回答:語言設計者去選擇,如果這樣做整數除法時,他們的語言會向零舍入,負無窮大或正無窮大。不同的語言做出了不同的選擇。

長答案: Python和Ruby的語言作者都認爲,對負無窮的舍入比舍入到零(比如C)更有意義。 python的創建者寫了一篇關於他的推理here的博客文章。我在下面摘錄了大部分內容。

有人問我(再次)今天解釋爲什麼在Python整數除法返回結果,而不是向零截斷像C.

對於正數的地板上,有沒有驚喜:

>>> 5//2 
2 

但是,如果一個操作數是負的,其結果是地板,即,從零取整遠(向負無窮):

>>> -5//2 
-3 
>>> 5//-2 
-3 

這會打擾一些人,但有一個很好的數學原因。 整數除法運算(//)和它的兄弟姐妹,模 操作(%),一起去和滿足一個漂亮的數學 關係(所有變量均爲整數):

a/b = q with remainder r 

這樣

b*q + r = a and 0 <= r < b 
(assuming a and b are >= 0). 

如果你想的關係爲負一(保持b 正)延伸,你有兩個選擇:如果您截斷q趨近於零,R 會變得消極,使不變變爲0 < = ABS(R )< 否則,您可以向負無窮大移動,並且 不變式仍然爲0 < = r < b。 [更新:固定此段]

在數學數理論中,數學家總是傾向於選擇後者 (請參閱,例如Wikipedia)。對於Python,我做出了相同的選擇 ,因爲有一些有趣的應用程序模 操作,其中a的符號不感興趣。考慮採取一個 POSIX時間戳(自1970年以來的秒數)並將其變爲 當天的時間。由於每天有24 * 3600 = 86400秒,因此這一計算僅爲t%86400.但如果我們在1970年之前使用負數表示時間 ,那麼「截斷趨近零」規則 將給出無意義的結果!使用地板規則,這一切都可以用 罰款。

+0

謝謝你的回答! – ivs

4

整數除法是特定於實現的。從Wikipedia的Modulo operation

許多實施方式使用截斷除法其中將該商擴大truncation Q中定義 = TRUNC(一個/Ñ),換句話說,它是在方向上的第一整數0的確切合理商數,餘數由 r = a - n q。非正式地說,商是「向零收益」,其餘部分與股息具有相同的符號。

Knuth描述地板除法其中商數由floor function q =地板(一個/Ñ),其餘的定義 - [R

r = a - nq = a - n \left\lfloor {a \over n} \right\rfloor.

這裏的商爲總是向下舍入(即使它已經是負數),其餘部分與除數符號相同。