簡體   English   中英

為什么[float.MaxValue == float.MaxValue + 1]確實返回true?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM