Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ 与迭代乘法相比,std::pow()的数值稳定性如何?_C++_Floating Point_Precision_Floating Accuracy_Numerical Methods - Fatal编程技术网

C++ 与迭代乘法相比,std::pow()的数值稳定性如何?

C++ 与迭代乘法相比,std::pow()的数值稳定性如何?,c++,floating-point,precision,floating-accuracy,numerical-methods,C++,Floating Point,Precision,Floating Accuracy,Numerical Methods,使用std::pow()会出现或解决什么样的稳定性问题 如果已知指数是整数,那么实现一个简单的函数来执行log(n)迭代乘法通常会更稳定(或者更快,或者完全不同) 就稳定性而言,std::sqrt(x)如何与std::pow(x,k/2)形式的东西进行比较?选择上面提到的方法,将其提高到整数次方,然后乘以平方根,这有意义吗?或者我应该假设std::pow()对于机器精度来说是快速和准确的吗?如果k=1,与std::sqrt()是否有区别 std::pow(x,k/2)或上述方法在稳定性方面如何

使用
std::pow()
会出现或解决什么样的稳定性问题

  • 如果已知指数是整数,那么实现一个简单的函数来执行
    log(n)
    迭代乘法通常会更稳定(或者更快,或者完全不同)

  • 就稳定性而言,
    std::sqrt(x)
    如何与
    std::pow(x,k/2)
    形式的东西进行比较?选择上面提到的方法,将其提高到整数次方,然后乘以平方根,这有意义吗?或者我应该假设
    std::pow()
    对于机器精度来说是快速和准确的吗?如果
    k=1
    ,与
    std::sqrt()
    是否有区别

  • std::pow(x,k/2)
    或上述方法在稳定性方面如何与
    std::sqrt(x)
    的整数幂进行比较

作为奖励,速度差异可能是什么

如果已知指数为整数,则实现一个简单函数来执行对数(n)迭代乘法通常会更稳定(或更快,或完全不同)吗

整数指数的结果通常不如
pow
准确,但两者都是稳定的,因为接近的输入会产生接近的结果。通过平方运算,可以期望通过乘法引入0.5 ULP的相对误差(例如,将x3计算为
x*x*x
)而得到1 ULP的误差)

当静态地知道第二个参数n为2时,则无论如何将xn实现为
x*x
。在这种情况下,它比任何可能的替代方案都更快、更准确

在稳定性方面,std::sqrt(x)如何与std::pow(x,k/2)形式的东西进行比较

首先,
sqrt
的准确性对于ieee754实现来说是无与伦比的,因为
sqrt
是本标准要求尽可能精确的基本操作之一

但你不是在问
sqrt
,你是在问(我想)关于*sqrt(x)而不是
pow(x,n+0.5)
。同样,一般来说,对于
pow
的高质量实现,您可以期望
pow(x,n+0.5)
比备选方案更精确。虽然
sqrt(x)
将计算为0.5 ULP,但乘法引入了它自己的近似值,最高可达0.5 ULP,总之,最好通过对一个实现良好的函数的单个调用来获得您感兴趣的结果。
pow
的高质量实现将为其结果提供1 ULP的准确性,而最佳实现将“保证”0.5 ULP

作为奖励,速度差异可能是什么


如果您事先知道指数将是一个小整数或0.5的倍数,那么您就有了
pow
的实现者所没有的信息,因此您至少可以通过测试成本来击败他们,以确定第二个参数是一个小整数。此外,高质量实现的实现者的目标是获得比简单的平方求幂更准确的结果。另一方面,
pow
的实现者可以使用极其复杂的技术来最小化平均执行时间,尽管准确性更好:例如,参见。在谈论
pow
的最佳实现时,我将动词“保证”放在引号内,因为
pow
是CRlibm的0.5 ULP精度保证的一个功能。

你在问一个问题,哪些部分适合实验和分析。你的实验和分析结果如何?Pascal Cuoq的回答很好,但我要补充的是,许多传统的和流行的
pow
实现都非常糟糕。@tmyklebu,哪种?@trbabb我差点提到了这一点,但它只是让信息复杂化了。由于在Windows上对pow(10.0,2.0)的评估为除
100.0
以外的两倍(例如:),该网站上出现了许多令人困惑的问题。由于数学结果可以精确地表示为double
100.0
,这意味着
pow
函数犯下的错误超过1ULP。但是,即使你使用了一个拙劣的
pow
函数,它有时会出错,比如说1.5 ULP,它仍然比四次乘法更精确。@trbabb:我没有对它们进行分类,但我看到一台相当新的Linux机器的
pow
是垃圾。指向CRlibm的链接似乎坏了或者站点坏了?