为什么 (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
,等等
- 我们如何表示
Int64
、Double
和 Decimal
等的范围?
- 为什么
(float.MaxValue / float.Epsilon)
的计算结果为无穷大?它不应该评估为非常接近但小于 float.MaxValue
的数字吗?
任何编程语言中的数字类型都是数学概念的近似值。由于这些概念包含无穷大,因此无法在真实计算机中准确表示。
范围(定义为类型的最大值和最小值之间的差值)只能由具有更大范围的类型表示。例如,您可以使用 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
中存储大于 float.MaxValue
的浮点数,Microsoft 决定将其分配为 Single.PositiveInfinity
。他们也可以决定结果应该是 Single.NaN
(不是数字),Single.MaxValue
甚至抛出异常。但这就是它的实施方式。 Single
类型(C#` 中的float
)符合二进制浮点运算的 IEC 60559:1989 (IEEE 754) 标准。
考虑以下代码和结果:
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
的范围,或者至少是它的整数部分。float.MaxValue / float.Epsilon
:float.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) 标准。