【问题标题】:Math precision requirements of C and C++ standardC 和 C++ 标准的数学精度要求
【发布时间】:2014-01-23 14:41:04
【问题描述】:

C 和 C++ 标准是否要求在 math.h 中对浮点数进行数学运算(即 sqrtexplogsin、...)以返回数值最佳解?

对于给定的(准确且有效的)输入,显然这些函数通常不会有准确的浮点输出。但是输出是否需要是最接近数学精确值的可表示值?

如果没有,是否对精度有任何要求(可能是特定于平台的/在其他标准中?),以便我能够对代码中的计算错误做出最坏情况的估计?现代实现的数值误差的典型限制是什么?

【问题讨论】:

  • 基本没有。 IEEE-754 甚至没有指定其中的大部分。可表示的位数有一些限制,但曾经有一段时间,不稳定的专有浮点实现激增,结果该语言没有指定浮点结果的大部分内容。毕竟是C精神
  • @doynax: +1 实现甚至不需要遵循 IEEE 754 浮点/双精度规范。
  • @doynax:你是什么意思 IEEE 754 没有指定其中的大部分? IEEE 754-2008 表 9.1 推荐 explogsin 等。
  • @EricPostpischil:看来我已经过时了,只阅读了 IEEE 754-1985。从对 2008 年修订版的粗略阅读看来,这些函数的准确性似乎没有明确,除了一些身份和奇怪的要求,即当且仅当它们不精确时才发出不精确的结果。这似乎处理起来不必要的昂贵。除了指数函数之外,肯定没有人会期待超越函数的确切结果?
  • @doynax:第 9.2 节,表格出现的地方,说函数应该正确四舍五入。这意味着考虑到舍入模式和格式,误差必须尽可能小;在四舍五入模式中,必须返回最接近的可表示值(打破常规规则)。我同意,这些结果通常不应被期望,除非那些已被证明是可行的(如CRlibm project。见我对MSalter’s answer的评论;这是在委员会后更改的。

标签: c++ c floating-point math.h


【解决方案1】:

不,而且有充分的理由。通常,您需要无限的精度(和无限的时间)来确定确切的数学结果。现在大多数时候您只需要一些额外的迭代来确定足够的位进行舍入,但是这个额外的位数量取决于确切的结果(简单地说:当结果接近 0.5 ULP 时)。即使确定所需的额外迭代次数也非常重要。因此,要求准确的结果比务实的方法要慢得多。

【讨论】:

  • +1 不错的答案。注意:同意exp(), log(), sin() 之类的函数,但我认为sqrt() 总是可以回答到最接近数学上精确的那个。想知道 IEEE-754 对 sqrt() 的看法吗?
  • @chux:在CRlbim 中提供了具有合理性能的explog 的正确舍入实现。 sin 可在 [-π, +π] 上正确四舍五入。 IEEE 754 建议使用正确的舍入来实现所有这些和一些其他功能(在表 9.1 中)。在委员会中,我反对这一点,因为其中一些不存在(并且仍然没有)可行的正确舍入实现,并且委员会通过了标准,但没有说它们应该正确舍入,但在委员会后编辑或投票中改变了.
  • 我之前的评论有错字; “CRlbim”应该是“CRlibm”。这是一个非常好的项目,可以实现具有正确舍入和良好性能的数学函数,并带有证明。
  • 谢谢 - 一个令人印象深刻的参考和表格。我的表 9.1 的参考版本暗示了一个推荐的正确舍入的域 sin()/cos() (−∞, +∞)。所以无法承受 K.C. Ng的“Good to the Last Bit”作品,还是(2014)只有[-π, +π]?
  • 为了稍微澄清一下 Eric 对 IEEE-754 的看法,其目的不是建议对 math.h 函数进行正确舍入,而是提供正确舍入的版本,以及可能的版本未正确舍入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2011-12-20
  • 2019-07-05
  • 2011-12-26
  • 1970-01-01
  • 2017-08-05
相关资源
最近更新 更多