我编写了一个代码来从标准输入和输出(到标准输出)A 读取两个长整数(A 和 B)的 B 次方。
它适用于 1^some huge number, 3^3 etc.
但不适用于 13^16。
我试着用 long int ans 来解决它,它给了我一个不同的值,但不是正确的值。
#include <stdio.h>
#include <math.h>
int main()
{
int x, n;
long int ans;
scanf("%d \n %d",&x, &n);
ans = pow(x,n);
printf("%d", ans);
return 0;
}
最佳答案
pow(1,anything)
始终为 1。pow(3, 3)
为 27。这些都是非常小的数字,很容易放入 32 位整数. pow(13,16)
是(大约)6.65 x 1017。这对于 32 位整数来说太大了,无法包含。它将变成一个 64 位整数(尽管 pow(14, 17)
不会)。您的编译器很可能将 long
视为 32 位值,这并不罕见。您可以尝试可能是 64 位的 long long
或明确为 64 位长的 int64_t
。
请注意 pow()
的原型(prototype)是
double pow(double x, double y);
这意味着它返回一个 double float ,然后将其强制转换为您的变量类型。 double
(一个 64 位 float )的尾数只有 53 位精度,这意味着即使将它转换回 64 位整数也不会得到准确的数字。你可以使用 powl()
其原型(prototype)是
long double powl(long double x, long double y);
但是 long double
可能被定义为 80 位或 128 位,甚至只有 64 位 (Microsoft)。它可能会为您提供所需的精度,但这就是幂运算的本质,即使是最长的 long double
,您的输入数字也不必变得太大就能溢出精度。
如果您真的需要将大数计算为大幂次,您将需要一个大型整数库。
关于c - Pow 不适用于两位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285529/