2013-02-27 39 views
7

NaNPositiveInfinityNegativeInfinity對於floatdouble有什麼好處?我們應該什麼時候使用或避免它們?何時使用NaN或+/- Infinity?

如果有這些常數,爲什麼float.Parse("a")會拋出錯誤而不是返回float.NaN

NaNnull有什麼不同?爲什麼division by zero甚至可以用於浮動類型?

+0

你可以使用的TryParse而不是解析? – Liam 2013-02-27 16:46:01

+2

由於數學運算而使用。 – Evgeny 2013-02-27 16:46:51

+8

@Evgeny:有史以來最迷人的評論。 – 2013-02-27 16:49:10

回答

7

他們沒有那麼多的東西,你使用,因爲它們是你需要知道的東西:

double hmm = 1.0/0.0; 
double hmm2 = -1.0/0.0; 
double hmm3 = 0.0/0.0; 
Console.WriteLine("1/0 == {0}", hmm); 
Console.WriteLine("-1/0 == {0}", hmm2); 
Console.WriteLine("0/0 == {0}", hmm3); 

輸出:

1/0 == Infinity 
-1/0 == -Infinity 
0/0 == NaN 

編輯: 至於這個問題:

如果有這些常量,爲什麼float.Par se(「a」)拋出一個錯誤,而不是返回float.NaN?

double.NaN實際上是在某種程度上數學定義 - 它是「定義爲」 0.0/0.0 - 而改爲「不是一個數字」意味着像double.Parse("a")也應該返回double.NaN,事實並非如此。爲什麼?

我的直覺是,因爲這是不可能的,以確定是否收到double.NaN是垃圾數據的結果(在字符串的情況下)或者實際定義一個不確定的數量,如零除以零。所以,爲了區分這兩種情況,double.Parse("a")會拋出一個Exception,我覺得它更準確。

+0

爲什麼除以零浮動類型可能嗎? – LZW 2013-02-27 18:16:19

+1

@LZW簡單的回答:因爲你可以在以前的版本中編譯/編譯/運行'1.0/0.0',這會導致一個'DivideByZeroException',但是對於定義的'Infinity'和'NaN'值有理論上的應用 - 例如,WPF使用這兩個表示「未設置」或「未定義」的大小等。 – JerKimball 2013-02-27 18:26:03

+0

@LZW:在許多情況下,確定*是否可以評估浮點表達式,而不需要任何中間計算超出範圍需要比那些在一切都在範圍內時評估表達式所需的計算更昂貴的計算。允許代碼嘗試評估表達式,然後發現問題是否比需要代碼提前檢測有問題的條件便宜。 – supercat 2015-02-19 03:52:09

6

如果有這樣的常數爲什麼float.Parse("a")拋出錯誤而不是返回float.NaN

,因爲無論你列出的備選方案都在這裏適用:

PositiveInfinityNegativeInfinity是 - 即它們是表達式,如1/0-1/0的結果。

NaN0/0的結果 - 也就是,表達式的結果不是(通常)定義良好,也不會產生數字。

float.Parse("a")就是這樣的。無可否認,它可能會由NaN代表,但是您無法區分輸入無效的float值(a)和有效的float值(NaN)之間的用戶。然而,這不是一個非常強烈的論點:NaN顯式地一個無效數字的佔位符,因此它可以想象用於表示無效的用戶輸入。

另一方面,還有其他類型有一個Parse方法和其中沒有NaN價值存在(如int)。對於這些類型,Parse必須因此表示出現錯誤。這將是不一致的(因此糟糕的API設計)使不同類型的'Parse方法行爲不同。

+2

JavaScript的parseFloat(「a」)返回NaN。 – LZW 2013-02-27 18:12:28

1

除了算術結果,無窮大值可以用來定義上下文的沒有限制。

例如:父級WPF控件要求其一個子級在沒有大小限制的情況下進行度量;即availableSize是PositiveInfinity時

價:MeasureOverride

+0

這是給現實世界(而不是理論)例子的唯一答案。 – LZW 2013-02-28 11:19:33

9

無窮大是使用,因爲它們是由浮點支持的運算系統的一部分。有各種各樣的操作,例如除以零,其中無窮是有用的結果,並且在數學上是合理的。顯然,沒有直接的物理量可以是無限的(例如,你不能有無限多克),但無窮大可能是物理過程或人類用計算機建模的其他事物的數學模型的某個方面的有用值。

使用NaNs是因爲算術系統不完整。也就是說,有些操作的輸入值的正確數學結果不能在浮點內表示。例如,sqrt(-1)是一個合法的數學運算,但結果虛數i不能用浮點表示。所以NaN被用作佔位符來表示值已經超出了浮點數。 NaN也可以用於其他目的,例如標記未被初始化的數據,以幫助調試。

float.Parse("a")拋出錯誤而不是返回NaN,因爲它不是合法的操作。此表達式不會執行數學運算,該運算在可表示數字之外具有適當的結果。這是一個實際的錯誤,所以會引發錯誤。

+0

我喜歡這個答案;它解釋了爲什麼Parse失敗,因爲你基本上試圖統一兩種沒有關係的類型(float和string) – JerKimball 2013-02-27 19:35:53

0

要解決NAN和無限大,用這個:

if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue)) 
{ 
    YourValue = 0; 
} 
相關問題