我需要在我的c ++程序中使用pow,如果我以这种方式调用pow()
函数:
long long test = pow(7, e);
哪里
e是一个整数值,其值为23.
我总是得到821077879
。如果我用Windows计算器计算它,我得到27368747340080916343
..这里有什么不对? ):
我试图投射到不同的类型,但没有任何帮助...这可能是什么原因?我如何正确使用pow()
?
谢谢!
答案 0 :(得分:7)
结果不适合long long
。
如果您想处理非常大的数字,请使用像GMP
这样的库或将其存储为浮点(不会那么精确)。
应用modulo:
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)
答案 1 :(得分:6)
7 23 太大而不适合long long
(假设它是64位)。该值被截断。
编辑哦,你为什么不说你想要pow(b, e) % m
而不仅仅是pow(b, e)
?这使事情变得更加简单,因为毕竟你不需要bigint。只需做你所有的算术模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;
}
}
答案 2 :(得分:4)
#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