为什么确实返回true?
我想知道你是否可以解释浮点类型的溢出。
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
转换为double, dMax + 1E292d
加起来为Infinity
。
这里的问题是浮点精度。 float.MaxValue
对应于3.40282e + 038f。 但float
精度要低得多,实际上只有7位数的精度。
超出该精度的任何东西都是“用零填充”,并且向该高数字添加1将不会改变它。
简而言之,差异在第39位,而float
只存储前7位(ish)。 这是浮点运算的一个特征。
要使float类型临时变量实际保存单个精度值,必须从内存中的float变量加载它。 通常允许编译器表示精度高于所需精度的单精度值,并且当值在寄存器中时,往往会这样做。 当它溢出回内存时,会失去额外的精度。