0做除數時

試着編譯運行下面的幾行小程序:

正常編譯後,運行發生了異常,程序被終止運行,啥也沒打印出來。當然問題也是顯然的,嚴重的除0異常。(沒有人會寫程序故意除以一個零,但難保來自於其它輸入渠道的數據不會導致一個0除數。這裏只是個例子,就簡單寫寫了。)

我們再把程序稍微改動一點:

 

只有一處改動:被除數由“3”變成“3.0”。

結果卻有所不同。當然,要說不正常結果依舊是不正常。但這次卻不是嚴重的終止了程序的運行時異常,程序本身是正常運行的,而且有結果輸出,只不過輸出了一個怪怪的東西,標示這個浮點數有問題。

前後的區別在於:在第一種情況下,是兩個整數相除,當除數爲0時產生一個嚴重的除0異常,程序被終止運行;在第二種情況下,由於除法運算的第一個操作數爲double型,那麼除數a也被先提升爲double型然後參與運算。浮點運算中,除0錯誤的結果不是一個運行時異常,而是得到一個“Not A Number”的特殊浮點值作爲結果,當這個值被打印時就輸出了那個怪怪的東西。

可以聯想到的一件事情是:float/double類型是有這種特殊值的,這一點不像各種int類型。一個int32bit,不管怎麼組合,其結果都是一個合法的int值。但float/double不同,float32bit或者double64bit,並非每種組合都是合法的。因此通過某種方式隨意組織32bit,來試圖形成一個“float隨機數”的想法是不正確的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章