c# - (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.");
}
}
}
感谢您的时间和想法!干杯。
解决方案
每个形状类都将具有额外的属性,例如面积、周长等。因此,即使提供的尺寸小于 MaxValue,如果用户如此倾向于计算的值也有可能是一个巨大的数字
double max 是1.7976931348623157E+308
,担心用户输入一些达到该限制的几何数据是没有意义的。简单地归还无穷大,它可能永远不会发生。换个角度来看,以微米为单位的 Proxima Centauri 的距离是近似的4,014 × 10^22
,所以你会注意到担心这是多么浪费时间。
你可以,为了至少给用户一个合理的选择,让他定义你几何环境中的一个单位代表什么;一微米,毫米,米,千米,光年,秒差距等,所以他总是将事物保持在合理的范围内。
推荐阅读
- python - 使用q-learning方法解决背包问题
- javascript - 如何将元素(在可编辑的div内)从光标位置分成两部分,然后在它之间插入一个自定义元素?
- firebase - 如何从 Firebase Cloud 功能向我的项目 API 发出 http 请求?
- python - Pygame应用程序未打开png
- unity3d - 围绕点旋转对象并沿正弦函数移动它
- spring-boot - 在关键的 Cloud Foundry 中使用受信任的 SSL 证书和 Spring Boot
- regex - 字符之间的正则表达式匹配
- javascript - 如何映射数组并使用索引以消除空值?
- java - 为什么 Java 和 Kotlin 对已弃用的方法显示不同的警告?
- android - 防止提交重复片段后,现有片段正在消失