2017-03-22 51 views
-5

如果我嘗試填充浮點數大於float.MaxValue的數字,會發生什麼情況?C中的浮點溢出#

我有這個在我的代碼:

int a; 
float x; 
float y; 

... 

float b = (a * x)/y; 

我對這個兩個問題:

  1. 存儲在臨時比浮動較大(A * X)的結果?這是隻有當結果通過float.MaxValue
  2. 當總和的結果填入a時,我會得到異常嗎?如果不是,我應該如何處理這個以防止災難?
+6

你嘗試,看看會發生什麼? – DavidG

+2

爲什麼你不運行它並找出答案? – tnw

+1

試試吧,你的電腦不會爆炸;) –

回答

2

你會得到float.PositiveInfinity(或float.NegativeInfinity)...或者你只是停留在float.MaxValuefloat.MaxValue + 1 == float.MaxValue)...浮點數有一個「決議」,即越低越浮動點。 ..最後兩個浮動點之間的距離大約是...

3,40282347E + 38:float.MaxValue

3,40282326E + 38:以前的浮動

2,028241E + 31:差異< --------- 2 * 2^31!

通過

float nearMaxValue = BitConverter.ToSingle(BitConverter.GetBytes(BitConverter.ToInt32(BitConverter.GetBytes(float.MaxValue), 0) - 1), 0); 
Console.WriteLine("{0:R}: float.MaxValue", float.MaxValue); 
Console.WriteLine("{0:R}: previous float", nearMaxValue); 
Console.WriteLine("{0:R}: difference", float.MaxValue - nearMaxValue); 
1

計算如果你試圖把一個float比float.MaxValue一些更大的內部,這將是「無限」

1
  1. 是,計算確實做在電腦的記憶中。情況總是如此。
  2. 不,溢出不會導致異常。

至於如果你運行該代碼段會發生什麼(清理錯誤後):

float b = (a * x)/y; 
Console.WriteLine(b); 

Output: +infinity 

a = (int)b; 
Console.WriteLine(a); 

Output: -2147483648