首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用浮点算法校验下的流量

用浮点算法校验下的流量
EN

Stack Overflow用户
提问于 2019-06-24 22:23:52
回答 1查看 242关注 0票数 3

我正在编写一个库,它包含多个长的数学公式,有时在使用双倍时会出现下流。一个例子可以是:

代码语言:javascript
复制
(Exp(-a*a) - Exp(-b*b))*Exp(c)*Exp(d) 

而a,b,c,d也涉及到一些类似类型的计算。我可以处理双倍错误(并返回适当的错误消息或某些分析界),但是如果我没有检测到下流(例如指数的差异),它会导致我负担不起的行为。(当这种差剪辑为零时,当其他指数非常大时,绝对误差和相对误差都可能很大)。

是否有类似于checked关键字的东西,适用于双关?有什么方法可以帮助我实现检查吗?

任何确保它是正确的解决方案,即使是一个升起更多的旗帜,必要是对我有利的。

This question被认为是一种复制,但是“在每个乘法之前手动检查”对我来说并不是一个特别有用的解决方案。

EN

Stack Overflow用户

回答已采纳

发布于 2019-06-24 23:23:24

是否有类似于checked关键字的东西,适用于双关?

不是的。

有什么方法可以帮助我实现检查吗?

一个不好的解决方案:根据您使用的硬件,浮点运算芯片可能会设置一个标志,指示某项操作是否已溢出。我不建议调用非托管代码来读取浮点芯片上的标志。(我在微软最初版本的Javascript中编写了这样的代码,要使逻辑正确是很痛苦的。)

一个更好的解决方案:您可以考虑编写一个符号逻辑库。例如,如果您键入自己的数字类型,会发生什么情况:

代码语言:javascript
复制
struct ExpNumber 
{
  public double Exponent { get; }
  public ExpNumber(double e) => Exponent = e;
  public static ExpNumber operator *(ExpNumber x1, ExpNumber x2) => 
    new ExpNumber(x1.Exponent + x2.Exponent);

诸若此类。你可以定义你自己的加法,减法,幂,对数等等,使用你所知道的幂的身份。然后,当你意识到事情是双倍的时候,你可以用任何稳定的算法来实现它,这样就可以避免你喜欢的下溢。

问题是,两倍故意用降低代表性和准确性来换取速度的大幅度提高。如果你需要精确地表示小于10e-200的数字,那么双数并不适合你;它们是为解决物理计算中的问题而设计的,而且没有那么小的物理量。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56744649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档