Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C+中sqrt函数的保证精度+;_C_Precision_Floating Accuracy_Math.h_Sqrt - Fatal编程技术网

C/C+中sqrt函数的保证精度+;

C/C+中sqrt函数的保证精度+;,c,precision,floating-accuracy,math.h,sqrt,C,Precision,Floating Accuracy,Math.h,Sqrt,每个人都知道C/C++中的math.h/cmath中的sqrt函数-它返回其参数的平方根。当然,它必须做一些错误,因为不是每个数字都可以精确地存储。但我能保证结果有一定的准确性吗?例如,“它是平方根的最佳近似值,可以用所使用的浮点类型表示,或如果计算结果的平方,则使用给定的浮点类型,它将尽可能接近初始参数” C/C++标准对此有什么影响吗?正如Chris Dodd在评论部分所注意到的,这个问题已经得到了回答。简而言之,它不是由C++标准保证的,但是IEEE-74标准保证了结果将尽可能接近“真实结

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


C/C++标准对此有什么影响吗?

正如Chris Dodd在评论部分所注意到的,这个问题已经得到了回答。简而言之,它不是由C++标准保证的,但是IEEE-74标准保证了结果将尽可能接近“真实结果”,即错误在最后一个地方将小于或等于1/2个单位。特别是,如果可以精确存储结果,则应该如此。

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

定义
\uu STDC\u IEC\u 559\uuu
的实施应符合本附录中的规范

以及:

中的
sqrt
功能提供IEC 60559平方根运算

IEC 60559(相当于IEEE 754)说明了一些基本操作,如
sqrt

除二进制-十进制转换外,执行每项操作时,应将其视为首先生成一个中间结果,该中间结果精确到无限精度并具有无限范围,然后强制该中间结果符合目标格式


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

@Mike,谢谢,但我的问题更广泛一点:我对我保证拥有的东西感兴趣?因为如果没有任何保证,我可以编写一个符合标准的sqrt(),它总是为正数返回0。@yeputons:请参阅链接问题——C/C++标准没有保证,但IEEE-754规范does@ChrisDodd我明白了,这回答了我的问题。非常感谢。@yeputons有趣的是,您选择了0来表达您在评论中的观点。0有一个奇怪的
sqrt()
属性。IEEE
sqrt(+0.0)
-->+0.0和
sqrt(-0.0)
-->-0.0。我认为“最后位置的1/2单位”取决于舍入模式。在某些舍入模式下,它将是“最后一位1个单位”。在任何情况下,这将是最好的每四舍五入模式。