簡體   English   中英

為什么 C# 允許在浮點類型中將非零數除以零?

[英]Why does C# allow dividing a non-zero number by zero in floating-point type?

為什么 C# 允許:

1.0 / 0 // Infinity

並且不允許:

1 / 0 // Division by constant zero [Compile time error]

在數學上,整數和浮點數除以零有什么區別嗎?

根據微軟的說法,“浮點算術溢出或除以零永遠不會引發異常,因為浮點類型基於 IEEE 754,因此具有表示無窮大和 NaN(非數字)的規定。”

更多關於這個here

從數學上講,沒有區別。 然而,對於計算機,只有標准IEEE-754 浮點規范具有表示 ±∞ 的特殊值。 整數只能容納...整數:-)

IEEE 浮點算術標准(IEEE 754) 是最廣泛使用的浮點計算標准,隨后是許多硬件和軟件實現,包括 C# 編譯器。

這意味着 C# 中的浮點變量可以包含表示奇怪生物的位模式,例如 PositiveInfinity、NegativeInfinity 和 Not-a-Number(縮寫為 NaN)。 根據 IEEE 754 算術規則,這些非有限浮點值中的任何一個都可以通過某些操作生成。 例如,無效的浮點運算(如零除以零)會導致 NaN。

在您的具體示例中,您可以看到 C#(與 VB 不同)重載 / 運算符以表示整數或浮點除法,具體取決於所涉及數字的數字類型。

在第一個示例中,編譯器看到 1.0,因此使用浮點除法並將結果放入浮點變量中。 該變量包含無窮大的表示。

在第二個示例中,編譯器看到 1,因此使用整數除法並將結果放入整數變量中。 因為 C# 中的整數類型使用二進制補碼系統來表示,並且不使用任何特殊的位模式來表示無窮大(或 NaN),所以編譯器會報錯。

還有其他有趣的浮點微妙之處 值得一讀Eric Lippert 關於該主題的博客文章

浮點除法由 IEEE754 管理,它規定除以零應該是無窮大。 整數除法沒有這樣的標准,所以他們只是遵循數學的標准規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM