c - 为什么 pow(n,2) 在 n=5 时使用我的编译器和操作系统返回 24?

标签 c math.h c-standard-library

#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”或类似函数,将值简单地乘以所需的次数。这样做的好处是:

  1. 您不会遇到使用 pow 可能会出现细微舍入错误的情况。

  2. 您的 intpow 函数很可能比对 pow 的等效调用运行得更快。

关于c - 为什么 pow(n,2) 在 n=5 时使用我的编译器和操作系统返回 24?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678481/

相关文章:

c++ - 将 Sqrt(x) 计算为 x * InvSqrt(x) 在 Doom 3 BFG 代码中是否有意义?

c - C 标准库中的头文件可以包含另一个头文件吗?

c - freopen() 在缓冲方面的预期行为 (setvbuf())?

char* 的 C 内存问题

c - C/C++中sqrt函数的保证精度

c - c中如何将整数存储到字符指针中

c - 为什么必须链接 C 中的数学库?

c - 为什么需要 islower() 和 friend 来处理 EOF?

将 BASE64 字符串转换为 BASE16(HEX) 字符串?

c - 在数组中传递字符串