![](/img/trans.png)
[英]What would be the value of float.MaxValue + 1 and float.MinValue - 1? Why?
[英]Why does (float.MaxValue / float.MinValue) evaluate to Infinity?
考慮以下代碼和結果:
double min = (double) float.MinValue;
double max = (double) float.MaxValue;
double epsilon = (double) float.Epsilon;
double range = max - min;
double delta = range / epsilon;
Console.WriteLine ($@"Min: [{min}].");
Console.WriteLine ($@"Max: [{max}].");
Console.WriteLine ($@"Epsilon: [{epsilon}].");
Console.WriteLine ($@"Range: [{range}].");
Console.WriteLine ($@"Delta: [{delta}].");
// Results:
// Min: [-3.4028234663852886E+38].
// Max: [3.4028234663852886E+38].
// Epsilon: [1.401298464324817E-45].
// Range: [6.805646932770577E+38].
// Delta: [4.8566719410840996E+83].
我正在嘗試一些微積分,試圖盡可能接近Zero (0)
,但令我驚訝的是我以前從未考慮過表示數字類型的范圍。
如何表示數字類型的范圍? 在上面的例子中,我們使用Double
來表示Single
范圍。 對於Int32
,我們可以使用Int64
等。
Int64
、 Double
和Decimal
等的范圍?(float.MaxValue / float.Epsilon)
評估為無窮大? 它不應該評估為非常接近但小於float.MaxValue
的數字嗎?任何編程語言中的數字類型都是數學概念的近似值。 由於這些概念包括無窮大,因此它們無法在真實計算機中准確表示。
范圍(定義為類型的最大值和最小值之間的差異)只能由具有更大范圍的類型表示。 例如,您可以使用decimal
或System.Numerics.BigInteger來表示Int64
的范圍。 BigInteger
也可用於表示float
和double
的范圍,或者至少是其中的 integer 部分。
float.MaxValue / float.Epsilon
: float.Epsilon
是小於一的正數( public const float Epsilon = 1.401298E-45;
)。 如果將正數除以小於一的正數,則結果大於該數。 例如,10 / 0.5 = 20。但由於您不能在 float 中存儲大於float.MaxValue
的float
,因此 Microsoft 決定將其分配為Single.PositiveInfinity
。 他們也可以決定結果應該是Single.NaN
(不是數字)、 Single.MaxValue
甚至是拋出異常。 但這就是它的實施方式。 Single
類型(C#中的float
`)符合二進制浮點運算的 IEC 60559:1989 (IEEE 754) 標准。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.