Pow()计算错误

Pow() calculates wrong?

本文关键字:错误 计算 Pow      更新时间:2023-10-16

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

long long test = pow(7, e);

,

e是一个值为23的整数值。

结果总是得到821077879。如果我用windows计算器计算,我得到27368747340080916343 ..这里有什么问题吗?):

我试着转换成不同的类型,但这里没有任何帮助…这可能是什么原因呢?如何正确使用pow() ?

谢谢!

结果不适合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)

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

现场观看: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