将整数提升到C中另一个整数的幂的最有效方法是什么?
// 2^3
pow(2,3) == 8
// 5^5
pow(5,5) == 3125
Run Code Online (Sandbox Code Playgroud) 在研究计算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)版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?
当我添加三个浮点值并将它们与1进行比较时,我遇到了问题.
cout << ((0.7 + 0.2 + 0.1)==1)<<endl; //output is 0
cout << ((0.7 + 0.1 + 0.2)==1)<<endl; //output is 1
Run Code Online (Sandbox Code Playgroud)
为什么这些价值观会有所不同?
我使用SSE类型进行了一些明确的矢量化计算,例如__m128(在xmmintrin.hetc中定义),但是现在我需要将向量的所有元素提升到某个(相同的)幂,即理想情况下我会想要类似的东西__m128 _mm_pow_ps(__m128, float),遗憾的是它不存在.
围绕这个最好的方法是什么?我可以存储向量,调用std::pow每个元素,然后重新加载它.这是我能做的最好的吗?编译器如何std::pow在自动矢量化代码时实现调用,否则代码可以很好地实现矢量化?有没有提供有用功能的库?
(请注意,这个问题与重复有关,当然也没有一个有用的答案.)