无符号长整数的 Pow 精度
Pow precision with unsigned longs
所以我正在尝试执行 pow (x, y)。其中 x 和 y 是无符号长整型,结果存储在无符号长整型中。这个结果将小于 2^63,所以我应该可以做到。
但是由于它 returns 是一个浮点数,所以我得到的大数结果不准确。有没有办法在不使用像 bignum 这样的外部库的情况下获得准确的结果?
我知道我可以简单地做 x*x Y 次,但这是我试图避免的,因为我试图让我的程序更快。
pow 函数 returns 有精度问题的 double,当你将它转换为 long 时,你肯定会遇到精度问题。据我所知,如果您不使用库,则无法单独使用 pow 函数获得准确的结果。
您还可以查看 Exponentiation by squaring and also look at the barak manos answer,您可以在其中尝试实现自己的 pow 函数,如
unsigned long long pow(unsigned long long x,unsigned int y)
{
unsigned long long res = 1;
while (y > 0)
{
if (y & 1)
res *= x;
y >>= 1;
x *= x;
}
return res;
}
pow
根据定义是不准确的。它使用 exp(y*log(x))
来模拟 x ^ y
。如果你想要完全精确,你要么需要使用外部库,要么制作你自己的 pow
.
版本
我不确定你的密码。但我猜你的代码是这样的
unsigned long x,y;
x=...//
y=...//
unsigned long res=pow(x,y);
这是不对的。因为 pow() 总是 return double 类型。
double pow(double x, double y)
这就是为什么你有双类型号码。
要获得正确的号码,您可以这样做:
unsigned long x,y;
x=...//
y=...//
unsigned long res=(unsigned long)pow(x,y);
所以我正在尝试执行 pow (x, y)。其中 x 和 y 是无符号长整型,结果存储在无符号长整型中。这个结果将小于 2^63,所以我应该可以做到。 但是由于它 returns 是一个浮点数,所以我得到的大数结果不准确。有没有办法在不使用像 bignum 这样的外部库的情况下获得准确的结果? 我知道我可以简单地做 x*x Y 次,但这是我试图避免的,因为我试图让我的程序更快。
pow 函数 returns 有精度问题的 double,当你将它转换为 long 时,你肯定会遇到精度问题。据我所知,如果您不使用库,则无法单独使用 pow 函数获得准确的结果。
您还可以查看 Exponentiation by squaring and also look at the barak manos answer,您可以在其中尝试实现自己的 pow 函数,如
unsigned long long pow(unsigned long long x,unsigned int y) { unsigned long long res = 1; while (y > 0) { if (y & 1) res *= x; y >>= 1; x *= x; } return res; }
pow
根据定义是不准确的。它使用 exp(y*log(x))
来模拟 x ^ y
。如果你想要完全精确,你要么需要使用外部库,要么制作你自己的 pow
.
我不确定你的密码。但我猜你的代码是这样的
unsigned long x,y;
x=...//
y=...//
unsigned long res=pow(x,y);
这是不对的。因为 pow() 总是 return double 类型。
double pow(double x, double y)
这就是为什么你有双类型号码。
要获得正确的号码,您可以这样做:
unsigned long x,y;
x=...//
y=...//
unsigned long res=(unsigned long)pow(x,y);