为什么 (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,等等

任何编程语言中的数字类型都是数学概念的近似值。由于这些概念包含无穷大,因此无法在真实计算机中准确表示。

  • 范围(定义为类型的最大值和最小值之间的差值)只能由具有更大范围的类型表示。例如,您可以使用 decimalSystem.Numerics.BigInteger 来表示 Int64 的范围。 BigInteger 也可以用来表示 floatdouble 的范围,或者至少是它的整数部分。

  • float.MaxValue / float.Epsilonfloat.Epsilon 是一个小于一的正数 (public const float Epsilon = 1.401298E-45;)。如果将一个正数除以一个小于 1 的正数,则结果大于该数。例如,10 / 0.5 = 20。但是由于您不能在 float 中存储大于 float.MaxValue 的浮点数,Microsoft 决定将其分配为 Single.PositiveInfinity。他们也可以决定结果应该是 Single.NaN(不是数字),Single.MaxValue 甚至抛出异常。但这就是它的实施方式。 Single 类型(C#` 中的float)符合二进制浮点运算的 IEC 60559:1989 (IEEE 754) 标准。