所以我想做pow(x,y)。其中x和y是无符号长整数,结果存储在无符号长整数中。这个结果将小于2 ^ 63所以我应该能够做到这一点。 但由于它返回一个浮点数,我得到大数字的不准确结果。无论如何都可以在不使用像bignum这样的外部库的情况下获得精确的结果? 我知道我可以简单地做x * x Y次,但这是我想避免的,因为我试图让我的程序更快。
答案 0 :(得分:5)
pow函数返回一个具有精度问题的double,当你将它转换为long时,你肯定会得到精度问题。据我所知,如果你不使用库,那么仅使用pow功能就无法获得准确的结果。
您还可以查看Exponentiation by squaring并查看barak manos answer,您可以在其中尝试实现自己的战队功能
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; }
答案 1 :(得分:1)
pow
不准确。它使用exp(y*log(x))
作为模拟x ^ y
的方式。如果您需要完全精确,则需要使用外部库或制作自己的pow
版本。
答案 2 :(得分:-1)
我不确定你的代码。但我想你的代码就像这样
double pow(double x, double y)
这是不对的。因为 pow()总是返回双重类型。
unsigned long x,y;
x=...//
y=...//
unsigned long res=(unsigned long)pow(x,y);
这就是你输入双重号码的原因。
要获得正确的号码,您可以这样做:
{{1}}