确定操作是否会导致溢出
本文关键字:溢出 是否 操作 | 更新日期: 2023-09-27 18:22:12
我的应用程序中有一些类表示物理单位,例如温度。这些类有能力拥有一些与它们相关联并发生变化的单位,如摄氏度和开尔文。它们还具有用户定义的"最大"answers"最小"值。
当我想改变单位时,我会得到两个给定单位之间的转换因子,然后通过对转换因子执行一些算术运算来改变类中的Min
、Max
和Data
值。
Double ConversionFactor = GetConversionFactor(curUnits, newUnits);
Units = newUnits;
Min *= ConversionFactor;
Max *= ConversionFactor;
Data *= ConversionFactor;
我遇到的问题是,有时用户可能会允许最大值和最小值为某种类型的MinValue
和MaxValue
,例如Double
。如果用户要更改转换系数大于1的单位,这将导致溢出。
C#中有没有一种方法可以检测上溢和下溢是否都会发生这种上溢
根据我对一些测试的了解,我认为我只需要检查运算的结果是否等于正无穷大或负无穷大?如果是这样,那么我可以将值设置回MinValue
或MaxValue
。
还有奖金问题。在我的测试中,我发现如果我创建一个Double max = Double.MaxValue
并添加一些小的东西,比如100。这个值不会改变。
为什么会这样
如果变量是双精度,则应检查Infinity
。
最好的方法是使用double.IsInfinity
,它将检查下溢和上溢(正无穷大和负无穷大)。
bool overflowed = double.IsInfinity(Min);
如果你想的话,你可以用自己的扩展方法来包装它
如果变量是整数,则可以将语句包装在checked
块中,这将在操作溢出时导致异常。这不是预防性的,但它起到了作用。
checked
{
...
}
你可以try...catch
那个。
浮点运算不抛出异常。
相反,您必须执行操作,然后检查结果,例如:
double d1 = double.MaxValue;
double d2 = double.MaxValue;
double d3 = d1*d2;
if (double.IsInfinity(d3))
Console.WriteLine("Infinity");
if (double.IsPositiveInfinity(d3))
Console.WriteLine("Positive Infinity");
d1 = double.MinValue;
d2 = double.MaxValue;
d3 = d1*d2;
if (double.IsInfinity(d3))
Console.WriteLine("Infinity");
if (double.IsNegativeInfinity(d3))
Console.WriteLine("Negative Infinity");
注意,如果double.IsPositiveInfinity(d)
或double.IsNegativeInfinity()
为真,则double.IsInfinity(d)
将为真。
正如您所观察到的,在double.MaxValue
中添加一个相对较小的数字不会产生double.Infinity
。这是因为四舍五入——你所加的值远小于指数如此大的二重所能表示的值。