C 中的 `pow(x, 15)` 函数给出 x >= 5 的错误(大负数)结果

`pow(x, 15)` function in C giving wrong (large negative) result for values of x >= 5

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

main() 
{

    int x, y;

    printf("Enter a number ");
    scanf("%d", &x);

    y = pow(x,15);

    printf("This is your new number %d", y);
}

当我将 x 作为 2、3 或 4 传递时,它给出了正确的结果,但是当我传递 5 或任何大于 5 的数字时,它给出了 -2147483648,这显然是不正确的。

这里有什么问题?有什么想法吗?

答案是 y 是一个 int,不能容纳大的输出值,所以你得到有符号溢出到负数 space,这是未定义的行为并且应该被视为您需要修复的错误。为 y 选择更大的数据类型,例如 long long,甚至更好,int64_t(包含在 #include <stdint.h>double 中,这是类型 pow()自然是returns。看这里:https://en.cppreference.com/w/c/numeric/math/pow

请注意 pow() returns 一种类型 double,它使用指数表示法来表示更大的数字,代价是随着数字从零开始增长而失去精度。要变得更大,请使用 powl()long double 类型进行数学运算,然后使 y 也成为 long double 类型。

这是一个可能被某些人认为是重复的相关答案,因为发生了一个非常相似的问题:Pow() calculates wrong?

在您的环境中,int 数据类型不够大,无法容纳值 515。您系统上的 int 类型可能只有 32 位,并且由于它是有符号类型,您只有 31 位,所以它可以容纳的最大正整数是 (232 - 1).

由于515 > (232 - 1),y中存储的结果溢出。自 pow returns double type, the behaviour of this overflowing conversion is undefined。与所有未定义的行为一样,无法保证会发生什么。即使 运行 同一程序连续两次也可能产生不同的结果。