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。与所有未定义的行为一样,无法保证会发生什么。即使 运行 同一程序连续两次也可能产生不同的结果。
#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。与所有未定义的行为一样,无法保证会发生什么。即使 运行 同一程序连续两次也可能产生不同的结果。