C 中的 `pow(x, 15)` 函数对 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,这显然是不正确的。

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

解决方法

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

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

,

答案是 y 是一个 int,不能容纳大的输出值,所以你会得到有符号溢出到负数空间,这是未定义的行为,应该被认为是一个错误你需要修复。为 y 选择更大的数据类型,例如 long long,或者更好的 int64_t(包含在 #include <stdint.h>double 中,即类型 { {1}} 自然返回。请参阅此处:https://en.cppreference.com/w/c/numeric/math/pow

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

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