【问题标题】:Guaranteed precision of sqrt function in C/C++在 C/C++ 中保证 sqrt 函数的精度
【发布时间】:2014-04-11 03:47:27
【问题描述】:

每个人都知道 C/C++ 中 math.h/cmath 中的 sqrt 函数 - 它返回其参数的平方根。当然,它必须有一些错误,因为不是每个数字都可以精确存储。但是我能保证结果有一定的精度吗?例如,'这是可以用所用浮点类型表示的平方根的最佳近似值or如果你计算结果的平方,它将尽可能接近使用给定浮点类型的初始参数'?

C/C++ 标准是否有相关内容?

【问题讨论】:

  • @Mike,谢谢,但我的问题有点宽泛:我对我保证拥有的东西感兴趣?因为如果根本没有保证,我可以编写一个符合标准的 sqrt(),它总是返回 0 来表示正数。
  • @yeputons:请参阅this answer 链接问题——C/C++ 标准不提供任何保证,但 IEEE-754 规范提供
  • @ChrisDodd 我明白了,这回答了我的问题。非常感谢。
  • @yeputons 有趣的是,您在评论中选择了 0 来表达您的观点。 0 有一个奇怪的sqrt() 属性。 IEEE sqrt(+0.0) --> +0.0 和 sqrt(-0.0) --> -0.0.

标签: c precision floating-accuracy math.h sqrt


【解决方案1】:

正如克里斯·多德(Chris Dodd)在 cmets 部分中注意到的那样,这个问题已经回答了 here。简而言之:C++ 标准不保证,但 IEEE-754 标准向我保证结果将尽可能接近“真实结果”,即误差将小于或等于 1/2 单位-最后一个地方。特别是如果结果可以精确存储的话,应该可以。

【讨论】:

  • 我认为“最后一个位置的 1/2 单位”取决于舍入模式。在某些舍入模式下,它将是“最后一个单位”。无论如何,这将是最好的每舍入模式。
【解决方案2】:

对于 C99,没有具体要求。但大多数实现都尽量支持附录 F:IEC 60559 浮点算法。它说:

定义__STDC_IEC_559__ 的实现应符合本附件中的规范。

还有:

<math.h> 中的 sqrt 函数提供 IEC 60559 平方根运算。

IEC 60559(等同于 IEEE 754)说明了 sqrt 等基本操作:

除了二进制十进制转换之外,每个操作都应该像首先产生一个无限精度和无限范围的中间结果一样执行,然后强制这个中间结果适合目标格式。

最后一步包括根据几种舍入模式进行舍入,但结果必须始终是目标精度中最接近的可表示值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多