2011-03-22 75 views
1

我有兩個控制檯應用程序(msvc 2008)。當它們被零除時, 它們的行爲不同。我的問題如下。msvc除以零

a)在一個應用中,除零的結果顯示爲1.#INF000000000000作爲調試器。
Printf「%4.1f」將其打印爲「1. $」。

b)在另一個應用程序中,在調試器中除以零9.2559631349317831e + 061的結果。
Printf「%4.1f」將其打印爲「-1。$」。

  1. Why既不應用具有零對DIV異常或信號?
    是不是例外/信號默認dehavour?

  2. 什麼是define以上兩個常量的名字?

  3. 一般情況下,如果我在div之前檢查分母== 0,那麼我應該使用哪個define值作爲虛擬結果? DBL_MIN好嗎?我發現NaN值不是。

  4. 我可以告訴stdio如何將一個特定的double值格式化爲char字符串我告訴它嗎?我意識到這是太多要問。但是,以我的應用程序中的viro DBL_MIN爲例,說告訴stdio打印,比如「n/a」會很好。

  5. 我應該如何處理,以實現最佳的可移植性,零除以及打印結果?通過打印,我的意思是「打印數字爲'不適用',如果它是由零除的結果」。
    在這裏我不清楚,我怎樣才能以便攜的方式在一個雙倍的情況下代表零的結果。

  6. 爲什麼兩個不同的結果?它是編譯器選項?

編譯器是C++,但使用非常像C.感謝。

+1

因爲除零不是一個指定的標準異常。看到這篇文章http://stackoverflow.com/questions/4747934/c-catch-a-divide-by-zero-error獲取更多信息。 – Mahesh 2011-03-22 23:01:22

+0

@Mahesh:這個問題處理*整數*除零。這個問題是關於浮點運算,它們的處理方式大不相同。 – Lindydancer 2011-04-09 10:35:19

回答

1

當用零進行浮點除法時,結果應該是無窮大(用特殊位模式表示)。

我的猜測是第二個應用程序實際上並不是按零執行除法,而是一個非常小的除法。您可以通過在調試器或跟蹤輸出中檢查底層表示來檢查此問題(您可以通過將它放在浮點類型和相同大小的整數中來訪問它)。請注意,僅僅打印它可能不會揭示這一點,因爲打印算法有時會將非常小的數字打印爲零。