簡體   English   中英

為什么 (float.MaxValue / float.MinValue) 評估為無窮大?

[英]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等。

  • 我們將如何表示Int64DoubleDecimal等的范圍?
  • 為什么(float.MaxValue / float.Epsilon)評估為無窮大? 它不應該評估為非常接近但小於float.MaxValue的數字嗎?

任何編程語言中的數字類型都是數學概念的近似值。 由於這些概念包括無窮大,因此它們無法在真實計算機中准確表示。

  • 范圍(定義為類型的最大值和最小值之間的差異)只能由具有更大范圍的類型表示。 例如,您可以使用decimalSystem.Numerics.BigInteger來表示Int64的范圍。 BigInteger也可用於表示floatdouble的范圍,或者至少是其中的 integer 部分。

  • float.MaxValue / float.Epsilonfloat.Epsilon是小於一的正數( public const float Epsilon = 1.401298E-45; )。 如果將正數除以小於一的正數,則結果大於該數。 例如,10 / 0.5 = 20。但由於您不能在 float 中存儲大於float.MaxValuefloat ,因此 Microsoft 決定將其分配為Single.PositiveInfinity 他們也可以決定結果應該是Single.NaN (不是數字)、 Single.MaxValue甚至是拋出異常。 但這就是它的實施方式。 Single類型(C#中的float `)符合二進制浮點運算的 IEC 60559:1989 (IEEE 754) 標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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