问题描述
#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()
,它使用指数表示法来表示更大的数字,代价是随着数字从零增长而失去精度。要变得更大,请使用 double
对 powl()
类型进行数学运算,然后将 long double
也设为 y
类型。
这是一个相关的答案,可能被一些人认为是重复的,因为发生了非常相似的问题:Pow() calculates wrong?。