在研究计算p ^ q(指数)的有效方法时,其中q是一个整数并且回顾了C++ 98和C++ 11标准,我注意到std::pow(double, int)在C++ 11 中显然已经消除了重载.
在C++ 98 26.5/6中它有double pow(double, int);签名.
在C++ 11 26.8所有我能找到的是重载采取一对float,double或者long double和一个明确的注意,在参数类型积分和双重的混合物的情况下,在pow(double, double)过载应挑选.
这只是对前一个意图的澄清,如果它们在C++ 98中被错误地添加了,它们是否真的在C++ 11中删除了,还是别的?
显然,该pow(double, int)版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?
我找到了 pow(x, n) 的迭代实现,它需要 o(log n) 时间和常量空间,如下所示:
double pow(double x, int n) {
double left = x;
double right = 1;
if (n<0) return 1/(x*pow(x,-n-1)); // Avoid binary overflow!!!!
if (!n) return 1;
while (n>1)
{
if (n%2==1) right *= left;
left = left * left;
n = n/2;
}
return left * right;
}
Run Code Online (Sandbox Code Playgroud)
但是我找不到这个算法的任何解释。我理解使用分而治之技术的递归解决方案,我猜这个解决方案使用了类似的技巧。但我不明白为什么会这样。任何人都可以向我解释这个算法吗?谢谢!
我想计算10增加到功率减去m.除了使用数学函数之外pow(10, -m),有没有快速有效的方法呢?
我从SO那里向c ++专家提出这样一个简单的问题是,正如你所知,就像基数2,10一样,它也是一个特殊的基础.如果某个值n乘以10的幂减去m,则相当于将n的小数点向左移动m次.我认为它必须是一种快速有效的应对方式.