【发布时间】:2019-06-24 22:23:52
【问题描述】:
我正在编写一个包含多个长数学公式实例的库,在使用双精度时有时会下溢。一个例子可能是:
(Exp(-a*a) - Exp(-b*b))*Exp(c)*Exp(d)
而且 a,b,c,d 也涉及一些类似类型的计算。 我可以处理双打出错(并返回适当的错误消息或一些分析界限),但如果我没有检测到下溢(例如指数的差异),它会导致我无法承受的行为。 (当这个差值归零而其他指数非常大时,绝对误差和相对误差都可能很大)。
是否有类似于 checked 关键字的东西适用于双打? 有什么方法可以帮助我实施检查吗?
任何确保其正确性的解决方案,即使是引发比必要更多的标志的解决方案对我都有好处。
This question 被建议为重复但“在每次乘法之前手动检查”对我来说并不是一个特别有用的解决方案。
【问题讨论】:
-
@O.Jones 在某种意义上重复,但没有给出真正的解决方案。使用非程序生成的代码检查每个乘法是可行的,但出于明显的原因,我宁愿避免这样做。
-
C# 不会为浮动下溢抛出异常。它只是将结果设置为零。所以你坚持做你自己的 epsilon 工作。这是颈部疼痛。正如你所发现的那样。
-
如果性能和开发时间不是问题,您可以定义自己的类,其中包含浮点和重载运算符 * 以及其他操作(通过执行检查)。这样你的代码会像以前一样干净,但需要一些工作。