我需要在我的C++程序中使用pow函数,如果我这样调用pow()
函数:
long long test = pow(7, e);
在这里,e是一个整数,值为23。
我总是得到
821077879
作为结果。如果我用Windows计算器计算,我得到的结果是27368747340080916343
。这里出了什么问题?):
我尝试将其转换为不同的类型,但没有帮助...可能的原因是什么?如何正确使用pow()
?
谢谢!
long long
的范围。const unsigned int b = 5; // base
const unsigned int e = 27; // exponent
const unsigned int m = 7; // modulo
unsigned int r = 1; // remainder
for (int i = 0; i < e; ++i)
r = (r * b) % m;
// r is now (pow(5,27) % 7)
723太大了,无法适应一个long long
(假设它是64位的)。数值将被截断。
编辑:哦,为什么你不说你只想要pow(b, e) % m
而不是只有pow(b, e)
呢?这使事情变得简单了许多,因为你根本不需要大整数。只需在模m
下执行所有算术运算即可。Pubby的解决方案可行,但这里有一个更快的解决方案(O(log e)而不是O(e))。
unsigned int powmod(unsigned int b, unsigned int e, unsigned int m)
{
assert(m != 0);
if (e == 0)
{
return 1;
}
else if (e % 2 == 0)
{
unsigned int squareRoot = powmod(b, e / 2, m);
return (squareRoot * squareRoot) % m;
}
else
{
return (powmod(b, e - 1, m) * b) % m;
}
}
#include<iostream>
#include<cmath>
int main()
{
long double ldbl = pow(7, 23);
double dbl = pow(7, 23);
std::cout << ldbl << ", " << dbl << std::endl;
}
输出: 2.73687e+19, 2.73687e+19
pow
函数返回的不是long long
而是long double
对吧? - Eric Petroeljepow()
返回一个double
,在赋值给test
时会转换为long long
。转换中的溢出是未定义行为(一些平台对此溢出有硬件异常)。 - Pascal Cuoq