考慮以下代碼和結果:
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)計算為 Infinity?它不應該評估為非常接近但小于 的數字float.MaxValue嗎?
uj5u.com熱心網友回復:
任何編程語言中的數字型別都是數學概念的近似值。由于這些概念包括無窮大,它們無法在真實計算機中準確表示。
范圍(定義為型別的最大值和最小值之間的差值)只能由具有更大范圍的型別表示。例如,您可以使用
decimal或System.Numerics.BigInteger來表示 的范圍Int64。BigInteger也可以用來表示范圍float和/double或至少是它的整數部分。float.MaxValue / float.Epsilon:float.Epsilon是一個小于一 (public const float Epsilon = 1.401298E-45;)的正數。如果將一個正數除以一個小于 1 的正數,結果將大于這個數。例如,10 / 0.5 = 20。但是由于您不能存盤比float.MaxValuea大的浮點數float,Microsoft 決定改為分配它Single.PositiveInfinity。他們也可以決定結果應該是Single.NaN(不是數字),Single.MaxValue甚至拋出例外。但這就是它的實施方式。的Single型別(float對于二進制浮點算術運算1989(IEEE 754)的標準:與IEC 60559在C#`)的規定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393772.html
