与迭代乘法相比,std :: pow()的数值稳定性是多少?

trb*_*abb 5 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::sqrt(x)

作为奖励,速度差异可能是多少?

Pas*_*uoq 8

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

通过对整数指数求平方取幂的结果通常不太准确pow,但是在关闭输入产生接近结果的意义上两者都是稳定的.可以通过平方通过乘法引入相对误差的0.5 ULP期望幂(例如,误差计算x的1 ULP 3x * x * x).

当第二个参数n静态地知道为2时,则一定要将x n实现为x * x.在这种情况下,它比任何可能的替代方案更快,更准确.

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

首先,sqrtIEEE 754实现的准确性无法超越,因为这sqrt是该标准要求尽可能准确的基本操作之一.

但你不是在询问sqrt,你问(我认为)关于<x n >*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尽管具有更高的准确性,但实施者可以使用极其复杂的技术来最小化平均执行时间:例如参见CRlibm的实现.在谈到最佳实现时,我将动词"保证"放在引号内,pow因为powCRlibm的0.5 ULP精度保证仅为"具有天文概率"的一个函数.