2017-03-22 63 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