c - Pow 不适用于两位数

标签 c

我编写了一个代码来从标准输入和输出(到标准输出)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/

相关文章:

c++ - Native 与 Protothreads,哪个更容易?

c - 如何用 ncurses 检测大写锁定?

c - 在字符串数组中查找字符串。 (C代码)

c - 记事本无法识别换行符 '\n',但可以与制表符等其他特殊字符配合使用

c - C 中的 .dat 结构化文件处理(手动?)

c - 我的解决迷宫的代码进入无限循环

c - 从 C 函数返回 char 指针

c++ - C/C++结构不完整成员类型不一致?

c - 如何使用 netsnmp_query_walk() 或 netsnmp_query_get()?

c - 转换为嵌套结构指针安全吗?