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)?
作为奖励,速度差异可能是多少?
如果已知指数为整数,那么实现一个简单的函数来执行log(n)迭代乘法会更稳定(或更快,或者完全不同)吗?
通过对整数指数求平方的取幂的结果通常不太准确pow,但是在关闭输入产生接近结果的意义上两者都是稳定的.可以通过平方通过乘法引入相对误差的0.5 ULP期望幂(例如,误差计算x的1 ULP 3为x * 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精度保证仅为"具有天文概率"的一个函数.
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |