![](/img/trans.png)
[英]Why does (float.MaxValue / float.MinValue) evaluate to Infinity?
[英]Why [float.MaxValue == float.MaxValue + 1] does return 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);
打印:
True, 3.402823E+38 False, 3.402823E+38 True, 1.79769313486232E+308 False, Infinity
所以,......正如Guffa所說, fMax + 1E23f
轉換為double, dMax + 1E292d
加起來為Infinity
。
這里的問題是浮點精度。 float.MaxValue
對應於3.40282e + 038f。 但float
精度要低得多,事實上,精度只有7位數。
超出該精度的任何東西都是“用零填充”,並且向該高數字添加1將不會改變它。
簡而言之,差異在第39位,而float
只存儲前7位(ish)。 這是浮點運算的一個特征。
要使float類型的臨時變量實際保存單個精度值,必須從內存中的float變量加載它。 通常允許編譯器表示具有比所需更高精度的單精度值,並且當值在寄存器中時傾向於這樣做。 當它溢出回內存時,會失去額外的精度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.