C/C++中sqrt函数的精度是否有保证?

8

大家都知道 C/C++ 中的 math.h/cmath 中的 sqrt 函数,它返回其参数的平方根。当然,由于不能精确存储每个数字,因此它会有一些误差。但我能保证结果具有一定的精度吗?例如,“它是可以表示所使用的浮点类型的平方根的最佳近似值或者如果计算结果的平方,则使用给定的浮点类型,结果将尽可能接近初始参数”?

C/C++ 标准中是否有相关规定呢?


1
https://dev59.com/ZWIj5IYBdhLWcg3wilvB - Mike
1
@Mike,谢谢你,但我的问题有点更广泛:我想知道我有什么保证?因为如果根本没有任何保证,我可以编写一个符合标准的sqrt()函数,它总是返回正数的0。 - yeputons
1
@yeputons:请参考这个答案来回答你提出的问题 - C/C++标准没有提供任何保证,但是IEEE-754规范做了相关规定。 - Chris Dodd
1
@ChrisDodd 我明白了,这回答了我的问题。非常感谢你。 - yeputons
@yeputons,有趣的是你在评论中选择了0来表达你的观点。0具有一个奇特的sqrt()属性。IEEE sqrt(+0.0) --> +0.0和sqrt(-0.0) --> -0.0。 - chux - Reinstate Monica
标准库自60年代以来就存在了,可以保证至少精确到+/-最不重要的小数位。由于其中有几个是公共领域的,因此对于特定的运行时环境而言,不使用其中任何一个都是愚蠢的(尽管我们知道,傻瓜很多)。 - Hot Licks
2个回答

9
对于C99,没有具体的要求。但是大多数实现尽可能支持IEC 60559浮点运算附录F。其中写道:
“定义__STDC_IEC_559__的实现应符合此附录的规定。”
并且:
在中的sqrt函数提供IEC 60559平方根操作。
IEC 60559(等同于IEEE 754)关于基本操作如sqrt的说法:
除了二进制& <->十进制转换外,每个操作都应像首先产生无限精度和无界范围的中间结果,然后将此中间结果强制适合目标格式一样执行。
最后一步包括根据几种舍入模式进行舍入,但结果必须始终是目标精度中最接近的可表示值。

1

这个问题已经在这里被回答了,正如克里斯·多德在评论中指出的那样。简而言之:虽然C++标准没有保证,但IEEE-754标准保证结果尽可能接近“真实结果”,即误差小于或等于最后一位的1/2单位。特别地,如果结果可以精确存储,那么就应该这样做。


我认为“1/2位于最后一位单位”取决于舍入模式。在某些舍入模式中,它将是“1个单位位于最后一位”。无论如何,它将是每种舍入模式下的最佳选择。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接