首页 > 解决方案 > (C#) 我应该在计算中防范 Infinity/-Infinity 吗?即抛出溢出异常?

问题描述

C#中寻找有关Infinity/-Infinity的一些建议。

我目前正在为矩形/圆形等形状构建几何类。用户将分别提供宽度/深度和直径的输入。

这些属性将是double并且我理解如果你要乘以 2 而不是显式溢出double.MaxValue,那么你会得到 +infinity 等。

每个形状类都将具有额外的属性,例如面积、周长等。因此,即使提供的尺寸小于 MaxValue,如果用户愿意,计算值也有可能是一个巨大的数字:

例如Math.PI x Math.Pow(diameter, 2) / 4=>Math.PI x Math.Pow(double.MaxValue, 2) / 4

(即,即使用户提供 MaxValue 作为输入,此方法也会导致 +infinity。)

我的问题是我是否应该一直防范无穷大?如果用户值或计算值输入无穷大,我应该抛出异常(OverflowException)吗?

看起来检查这些几何类中每个属性/方法的无穷大可能是一种代码味道……有更好的方法吗?

public double Area
{
    get
    {
        double value = Math.PI * Math.Pow(this.diameter, 2) / 4;
        if (double.IsInfinity(value)
        {
            throw new OverflowException("Area has overflowed.");
        }
    }
}

public double Perimeter
{
    get
    {
        double value = Math.PI * this.diameter;
        if (double.IsInfinity(value)
        {
            throw new OverflowException("Perimeter has overflowed.");
        }
    }
}

感谢您的时间和想法!干杯。

标签: c#.net.net-corefloating-point-exceptions

解决方案


每个形状类都将具有额外的属性,例如面积、周长等。因此,即使提供的尺寸小于 MaxValue,如果用户如此倾向于计算的值也有可能是一个巨大的数字

double max 是1.7976931348623157E+308,担心用户输入一些达到该限制的几何数据是没有意义的。简单地归还无穷大,它可能永远不会发生。换个角度来看,以微米为单位的 Proxima Centauri 的距离是近似的4,014 × 10^22,所以你会注意到担心这是多么浪费时间。

你可以,为了至少给用户一个合理的选择,让他定义你几何环境中的一个单位代表什么;一微米,毫米,米,千米,光年,秒差距等,所以他总是将事物保持在合理的范围内。


推荐阅读