为什么[float.MaxValue == float.MaxValue + 1]确实返回true?

Hom*_*mam 28 c# floating-point overflow

我想知道你是否可以解释浮点类型的溢出.

float.MaxValue == float.MaxValue + 1 // returns true
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 24

因为1它太小而不能减少float.MaxValue价值.

小于1e32的任何东西都将低于浮点数的精度,因此它实际上与添加零相同.

编辑:

ulrichb表明,1e23的值确实会影响float.MaxValue,这意味着你根本不会比较浮点数,而是加倍.编译器在添加和比较之前将所有值转换为双精度值.

  • 还是一个非常大的1? (12认同)
  • 但是,如果你真的非常快地添加1怎么办呢?:) (6认同)
  • 你可能需要一个更好的1. (4认同)

ulr*_*chb 9

这很有趣:

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);
Run Code Online (Sandbox Code Playgroud)

打印:

True, 3.402823E+38
False, 3.402823E+38
True, 1.79769313486232E+308
False, Infinity

所以,......正如Guffa指出的那样,它fMax + 1E23f被转换为双倍并dMax + 1E292d加起来Infinity.