#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,i,ele;
n=5;
ele=pow(n,2);
printf("%d",ele);
return 0;
}
输出是24
。
我在 Code::Blocks 中使用 GNU/GCC。
发生了什么事?
我知道 pow
函数返回一个 double
,但是 25
适合一个 int 类型,所以为什么这段代码打印一个 24
而不是 25
?如果n=4; n=6; n=3; n=2;
代码有效,但对于 5 个则无效。
最佳答案
这是这里可能发生的事情。您应该能够通过查看编译器对 pow
函数的实现来确认这一点:
假设你有正确的#include's,(之前所有关于这个的答案和评论都是正确的——不要认为 #include
文件是理所当然的),标准 pow
函数是这样的:
double pow(double, double);
并且您正在这样调用 pow
:
pow(5,2);
pow
函数通过算法(可能使用对数),因此使用浮点函数和值来计算幂值。
pow
函数不会天真地“将 x 的值乘以 n 次”,因为它还必须使用小数指数计算 pow
,并且你不能那样计算分数幂。
很可能,使用参数 5 和 2 计算 pow
会导致轻微的舍入误差。当您分配给 int
时,您截断了小数值,因此产生 24。
如果您使用的是整数,您不妨编写自己的“intpow”或类似函数,将值简单地乘以所需的次数。这样做的好处是:
您不会遇到使用
pow
可能会出现细微舍入错误的情况。您的
intpow
函数很可能比对pow
的等效调用运行得更快。
关于c - 为什么 pow(n,2) 在 n=5 时使用我的编译器和操作系统返回 24?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678481/