gpt4 book ai didi

c# - (C#) 我应该在计算中防范无穷大/-无穷大吗? IE。抛出溢出异常?

转载 作者:行者123 更新时间:2023-12-04 09:59:37 24 4
gpt4 key购买 nike

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

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

这些属性将是 double我明白,如果你要多个 double.MaxValue,而不是显式溢出。到 2,那么你会得到 +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.");
}
}
}

珍惜你的时间和想法!
干杯。

最佳答案

从概念上讲,您遇到了设计问题。导致无限区域的值会导致您的形状处于无效状态。

例如,假设所讨论的形状是圆形。任何传入 Area > double.MaxValue 的值都是无效状态。换句话说,diameter 无效的任何值 Math.PI * Math.Pow(diamater, 2) > double.MaxValue

解决 double.MaxValue = Math.PI * Math.Pow(diamater, 2)diameter (它是 1.5129091144565236E+154 ,欢迎你验证我的数学),并在你的构造函数中检查它,

private const double MaxDiameter = 1.5129091144565236E+154;
Circle(double diameter)
{
if (diameter > MaxDiameter)
{
throw ArgumentOutOfRangeException();
}
}

——

以上可能都不重要

在实践中,请考虑以下事项。已知宇宙的直径约为 30 gigaparsecs,转换为普朗克长度(我能想到的最小距离单位)约为 5.7e61,远低于 double.MaxValue

我不担心您的属性中的双重溢出。明智的做法是设计您的形状,以便它使用您定义的单位类型,因此您始终知道您正在使用什么单位。
public Circle(Meters diamater)
public Rectangle(Meters width, Meters height)

关于c# - (C#) 我应该在计算中防范无穷大/-无穷大吗? IE。抛出溢出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61857733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com