Pow()函数计算错误了吗?

5

我需要在我的C++程序中使用pow函数,如果我这样调用pow()函数:

long long test = pow(7, e);

在这里,e是一个整数,值为23。

我总是得到821077879作为结果。如果我用Windows计算器计算,我得到的结果是27368747340080916343。这里出了什么问题?):

我尝试将其转换为不同的类型,但没有帮助...可能的原因是什么?如何正确使用pow()

谢谢!


2
pow 函数返回的不是 long long 而是 long double 对吧? - Eric Petroelje
1
使用 long double 数据类型,我得到了 821077879.00000000 的结果,但仍然是错误的。 - user1004012
1
@EricPetroelje pow() 返回一个 double,在赋值给 test 时会转换为 long long。转换中的溢出是未定义行为(一些平台对此溢出有硬件异常)。 - Pascal Cuoq
3个回答

8
结果超出了 long long 的范围。
如果你需要处理非常大的数,可以使用类似 GMP 的库。
或者将其存储为浮点数(但精度可能会降低)。
应用取模运算:
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)

有没有其他方法只针对这一个情况?我不想为了一个特定的代码行在我的程序中实现整个库。 - user1004012
如上所述,我得到了相同的结果:“使用long double,我得到了821077879.00000000作为结果,这仍然是错误的...”出了什么问题? - user1004012
这个已经运行正确了,谢谢。但是如果我想把模操作应用到双精度值上,下一个问题就出现了...如何计算如此大的值的模? - user1004012
我正在尝试实现RSA算法,参考链接为http://en.wikipedia.org/wiki/RSA_%28algorithm%29。除了加密行c = m^e (mod n)之外,一切都正常工作。我想在C++应用程序中正确地实现这一行。 - user1004012
哦,我发布了最后一条消息时没有看到你的回复。我会尝试这个,谢谢! - user1004012
显示剩余3条评论

6

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;
   }
}

那么我应该使用哪种类型呢?我想在我的RSA函数中实现它。 - user1004012
1
...而Windows计算器可以处理它,因为从某个版本开始,他们插入了一个任意精度库来处理数学。 - Matteo Italia

4
请在线查看: https://ideone.com/YsG7V
#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


如何使用变量名?我应该将结果存储在哪种变量类型中? - user1004012

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接