2011-11-06 104 views
11

要清楚,我不是在尋找NaN或無窮大,或者詢問x/0的答案應該是什麼。我正在尋找的是:除以零的結果是什麼?

根據硬件如何執行分割(我不知道它是如何完成的),如果分割是使用除數0執行的,並且處理器只是沿着高興地通過手術,會有什麼結果呢?

我意識到這是高度依賴於股息,所以對於一個具體的答案,我問這個:如果它遵循其標準除法運算42/0,電腦會吐出什麼?

更新:

我會盡量更清晰一點。我正在詢問用位級別的數字完成的實際操作以達成解決方案。操作的結果只是位。當除數被發現爲零時,NaN和錯誤/例外發揮作用。如果這個部門真的發生了,會發生什麼?

+0

題外話:屬於http://math.stackexchange.com/ –

+5

NaN會出來。你認爲電腦隱藏了我們的真實結果嗎? – ceejayoz

+4

@AlastairPitts你確定嗎?由於它是關於處理器如何處理操作的,它似乎更適合於這裏而不是純粹的數學站點。 – yoozer8

回答

11

它可能只是不會停止。整數除法可以通過重複減法在線性時間內執行:對於7/2,您可以從7中減去2總共3次,這就是商數,餘數(模數)是1.如果要提供除非有一種機制可以阻止它,否則算法不會停止:0可以從42中減去0,無限次數而無需任何地方。

從類型的角度來看,這應該是直觀的。未定義的計算結果一個不停頓的結果是⊥(「bottom」),這是未定義的值,適用於所有類型。除零的定義並不是在整數上定義的,所以它應該通過引發錯誤或者不終止而正確地產生⊥。前者可能更可取。 ;)

其他更有效的(對數時間)除法算法依靠收斂於商的序列;對於0的分紅,據我所知,這些將不會收斂(即無法終止)或產生0.請參閱維基百科上的Division

浮點除法同樣需要一個特例:分兩個浮點數,減去它們的指數並整數除它們的有效數。同樣的底層算法,同樣的問題。這就是爲什麼在IEEE-754中有正負無窮大的表示法,以及有符號零和NaN(0/0)的原因。

+5

它*可以*通過重複減法來實現,但它不是在實踐中... –

+0

@OliCharlesworth:是的。我正在編輯添加關於其他算法的註釋。 –

+0

即使長時間分割,硬件也會終止。它將執行固定數量的階段。 –

8

對於具有內部「除法」指令的處理器,如具有div的x86,如果嘗試除以零,CPU實際上會導致軟件中斷。該軟件中斷通常由語言運行時捕獲並轉換爲適當的「除零」異常。

+0

這並不回答問題。 –

+0

是的,這個問題自我的回答以來一直在編輯。我已經爲你的+1了。 –

2

這取決於實施。 IEE標準754浮點[1]定義了有符號無窮大值,因此理論上應該是除以零的結果。如果在除法操作中demoninator爲零,硬件只需設置一個標誌。它沒有魔法。

一些錯誤的(讀取x86)架構如果從數學的角度來看是一個警察,那麼他們在理論上達到零除數時會拋出一個陷阱。

[1] http://en.wikipedia.org/wiki/IEEE_754-2008

+0

不,「從數學的角度來看」你不能用0來除。它只是沒有定義。我們稱之爲「無窮大」是一個代表任意大數的符號,它是將「東西」幾乎除以0(但不是0)的結果。 – Alvaro

1

這將是一個無限循環。通常,分割是通過連續減法來完成的,就像通過連續加法完成乘法一樣。

所以,零是特殊的,因爲我們都知道答案是什麼。

+2

真的嗎?乘法和除法是線性時間操作? –

1

它實際上會吐出一個異常。在數學上,42/0是不確定的,因此計算機不會爲這些輸入吐出特定的值。我知道可以用硬件來完成除法,但設計良好的硬件會有某種標記或中斷,告訴你包含在結果中的寄存器中包含的值無效。許多電腦都是這個例外。

+2

此外,我正在寫這個評論,以排除任何人說42/0實際上是無窮大。褻瀆!當X傾向於0時42/X趨於無窮大,但42/0只是未定義。巨大差距。 –

+0

完全正確,42/x = oo只是一個表示任意大數的符號:「結果隨x越接近0而增大」 – Alvaro

5

硬件分隔符通常使用流水線long division結構。

假設我們現在談論整數除法(而不是浮點);長期分工的第一步是調整最重要的(在試圖從股息中扣除除數之前)。顯然,這在0的情況下是未定義的,所以誰知道硬件會做什麼。如果我們假定它確實有理智,下一步就是執行log(n)減法(其中n是位位置的數量)。對於每個產生肯定結果的減法,在輸出字中設置1。所以這一步的輸出將是一個全1的詞。

浮點除法需要三個步驟:

  • 服用指數的尾數的
  • 定點除法
  • 處理特殊的情況下的差

0由下式表示全部爲0(尾數和指數)。然而,尾數總是隱含的前導1,所以如果我們不把這種表示看作是一種特殊情況,它只會看起來和表現爲2的極小的冪。

+0

如果有一些機器除零指令會使凍結執行單元,直到監控計時器電路識別出故障。爲了「乾淨」地添加硬件,避免試圖用零分割卡住會使計算機更加昂貴,所以如果有些機器不打擾,我不會感到驚訝。 – supercat

-1

X/0其中X是爲實數的一個元素,並且大於或等於1,因此X/0 =無窮大的答案爲 。

司方法(C#)

Int Counter = 0; /* used to keep track of the division */ 
Int X = 42;  /* number */ 
Int Y = 0;  /* divisor */ 
While (x > 0) { 
    X = X - Y; 
    Counter++; 
} 
Int answer = Counter; 
+0

「我正在詢問用位級別的數字完成的實際操作以達成解決方案。」 -OP。 – Nenotlep

1

在x86,中斷0發生,並且輸出寄存器不變

最少16位實模式的例子(被添加到例如引導加載):

movw $handler, 0x00 
    movw %cs, 0x02 
    mov $0, %ax 
    div %ax 
    /* After iret, we come here. */ 
    hlt 
handler: 
    /* After div, we come here. * 
    iret 

How to run this code in detail || 32-bit version

DIV指令的英特爾文檔沒有說常規輸出寄存器(ax ==結果,dx ==模塊)被修改,所以我認爲這意味着它們保持不變。

然後,Linux會處理該中斷,將SIGFPE發送到執行該操作的進程,如果不處理,該進程將會終止該進程。