float pow(float base, int iexp )在C++ 11中删除了重载的函数,现在pow返回一个double.在我的程序中,我计算了很多这些(单精度),我对如何做到最有效的方式感兴趣.
是否有一些特殊功能(在标准库或任何其他)具有上述签名?
如果没有,在任何其他操作(将其他所有内容都投入)或者转换为使用重载函数之前,是否更好(在单精度方面的性能方面)显式地pow转换结果?floatdoubleiexpfloatfloat pow(float base, float exp)
编辑:为什么我需要float和不使用double?
主要原因是RAM - 我需要数十或数百GB,因此这种减少是巨大的优势.所以我需要float得到float.现在我需要最有效的方法来实现这一目标(减少演员阵容,使用已经优化的算法等).
fpow您可以轻松地使用乘方和平方来编写自己的代码。
float my_fpow(float base, unsigned exp)
{
float result = 1.f;
while (exp)
{
if (exp & 1)
result *= base;
exp >>= 1;
base *= base;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
该算法提供了最好的精度,可以在|base|float时使用类型进行存档。> 1
让我们来计算基数 和指数pow(a, n)在哪里。
让我们定义b 1 =a 1、b 2 =a 2、b 3 =a 4、b 4 =a 8等。an
那么a n是所有这样的b i 的乘积,其中第i 位在n中设置。
所以我们已经订购了集合B={b k1 ,b k1 ,...,b kn }并且对于任何j,位 k j被设置在n中。
以下明显的算法A可用于舍入误差最小化:
现在,让我们证明B中的元素可以从左到右相乘,而不会损失准确性。它来自这样的事实:
b j > b 1 *b 2 *...*b j-1
因为b j =b j-1 *b j-1 =b j-1 *b j-2 *b j-2 =...=b j-1 *b j-2 *...*b 1 *乙1
因为,b 1 = a 1 = a及其模大于 1:
b j > b 1 *b 2 *...*b j-1
因此我们可以得出结论,在从左到右的乘法过程中,累加器变量小于B中的任何元素。
然后,表达式result *= base;(当然除了第一次迭代)将B中的两个最小数字相乘,因此舍入误差最小。因此,代码采用算法A。
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |