【发布时间】:2022-01-25 21:11:08
【问题描述】:
考虑以下代码和结果:
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的数字吗?
【问题讨论】:
-
float.MaxValue约为 3e38,float.Epsilon约为 1e-45。第一个除以第二个大约是 3e83,远远超过 3e38,不是吗? -
@Sweeper:你是对的。我试图计算在
float.MinValue和float.MaxValue范围之间我可以做的最小增量。我没有意识到除法不会透露将发生的迭代次数。 -
通过
doubles 中的计算,您已经可以看到更准确的结果。那是你的Delta输出:4.8566719410840996E+83。这是一个比float.MaxValue大得多的数字,因此它会导致无穷大。 -
正如 Hans Passant 的链接所暗示的,没有单一的“我可以在 float.MinValue 和 float.MaxValue 的范围之间做的最小可能增量”。相反,您可以做的最小可能增量是您要增加的数字的函数。你可能想要实现类似this。
标签: c# .net types range numeric