Pow()计算错误
Pow() calculates wrong?
我需要在我的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
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 如何在常量计算表达式中获取编译时错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 2 个双精度值之间的差值计算错误?
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- C++ openmp 并行计算计算错误的结果
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 术语不计算为函数采用 1 个参数错误?
- Travis CI 中奇怪的编译器错误不会在本地计算机上发生
- 点云库:计算筛选关键点 - 输入云错误
- 在线程错误 C2064 中:term 的计算结果不为 0 个参数的函数
- GetAsyncKeyState(VK_RETURN) 错误地计算为 true
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- log2 计算在 CPP 中给出了错误的结果
- 错误计算RSI或错误在MetaTrader 4
- c++程序错误计算