我想知道你能否解释一下浮点类型中的溢出(Overflow)。
float.MaxValue == float.MaxValue + 1 // returns true
我想知道你能否解释一下浮点类型中的溢出(Overflow)。
float.MaxValue == float.MaxValue + 1 // returns true
由于数字 1
太小了,无法对 float.MaxValue
的值产生影响。
任何小于 1e32 的数将低于浮点数的精度,因此实际上相当于添加了一个零。
ulrichb 表明值为 1e23 实际上确实会影响 float.MaxValue,这必须意味着你并没有比较浮点数,而是双精度浮点数。编译器在添加和比较之前将所有值转换为双精度浮点数。
那非常有趣:
float fMax = float.MaxValue;
double dMax = double.MaxValue;
Console.WriteLine("{0}, {1}", fMax == fMax + 1E22f, fMax + 1E22f);
Console.WriteLine("{0}, {1}", fMax == fMax + 1E23f, fMax + 1E23f);
Console.WriteLine("{0}, {1}", dMax == dMax + 1E291d, dMax + 1E291d);
Console.WriteLine("{0}, {1}", dMax == dMax + 1E292d, dMax + 1E292d);
输出:
真, 3.402823E+38 假, 3.402823E+38 真, 1.79769313486232E+308 假, 无穷大
因此,正如Guffa所指出的那样,fMax + 1E23f
被转换为双精度浮点数,并且 dMax + 1E292d
相加结果为 Infinity
。
float.MaxValue
对应的是3.40282e+038f。但是float
的精度要小得多,实际上只有7位有效数字。float
只能存储前7位左右。这是浮点数算术的一个特征。