我已经用C ++编程了一段时间了。以前我曾见过幂函数由于精度问题而对较大的幂给出了错误的答案,但是今天在解决编码问题时,我看到在相同类型的参数下,将pow()函数放在函数中与直接评估时给出的值不同。
#include<iostream>
#include<math.h>
using namespace std;
#define ll long long
ll n,d;
ll power(ll x)
{
return pow(100,x);
}
ll powersecond(ll x)
{
return pow(100,(int)x);
}
int main()
{
n = 68; d = 2;
cout<<n*power(d)<<endl; // outputs 679932
cout<<n*pow(100,d)<<endl; // outputs 680000
cout<<n*powersecond(d)<<endl; // outputs 679932
cout<<n*pow(100,(int)d)<<endl; // outputs 680000
return 0;
}
[注意,即使在powersecond()函数中将x转换为整数后,答案也不会改变。即使d是int而不是long long int,答案仍然是679932。我使用的编译器是VS Code中的gnu gcc编译器。
没有问题,每个都解决了不同类型的std::pow的不同重载。
std::pow
是使用浮点算法计算的,因此您可能会得到像这样的数值奇数。对于精确的整数版本,请使用快速整数方法(尽管整数数据类型的范围较小):
template <class T, class N>
T ipow(T x, N pow)
{
auto value = T(1);
while (pow != 0)
{
if ((pow & 1) == 1)
{
value *= x;
}
x *= x;
pow >>= 1;
}
return value;
}
请注意,这仅适用于正整数,但是很容易在此之上构建适用于负整数的一个。