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

exs*_*ake 23 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;
}
Run Code Online (Sandbox Code Playgroud)

输出是24.

我在Code :: Blocks中使用GNU/GCC.

怎么了?

我知道pow函数返回一个double,但是25适合一个int类型所以为什么这个代码打印24而不是25?如果n=4; n=6; n=3; n=2;代码有效,但有五个代码没有.

Pau*_*zie 25

这是可能发生的事情.您应该能够通过查看编译器的pow函数实现来确认这一点:

假设你有正确的#include,(所有以前的答案和评论都是正确的 - 不要认为#include文件是理所当然的),标准pow函数的原型是这样的:

double pow(double, double);

而你这样打电话pow:

pow(5,2);

pow函数通过算法(可能使用对数),因此使用浮点函数和值来计算功率值.

pow函数没有通过一个天真的"乘以n倍的xa总和的值",因为它还必须pow使用小数指数计算,并且你不能用这种方式计算分数幂.

因此,pow使用参数5和2 的计算很可能导致轻微的舍入误差.当您分配给a时int,您截断了小数值,因此产生24.

如果你使用整数,你也可以编写自己的"intpow"或类似的函数,只需将值乘以必要的次数即可.这样做的好处是:

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

  2. 你的intpow函数很可能比同等的调用运行得更快pow.

  • 如果你打算使用自己的整数幂,你应该使用[通过平方取幂](http://en.wikipedia.org/wiki/Exponentiation_by_squaring)而不是重复乘法,因为后者是**O(n )**和前者是**O(log n)**. (14认同)
  • @aruisdante:请注意,符号表示从线性到对数复杂度的转变,实际上是从[伪线性](https://en.wikipedia.org/wiki/Pseudo-polynomial_time)转换为线性复杂度. (3认同)
  • @BenVoigt从技术上讲,先前的评论应该更具体:朴素算法需要O(n)算术运算(乘法或加法),其中n是指数; 平方将其减少为O(log(n)).如果我们将n中的位数作为问题大小,我们可能还需要计算每个乘积中的位数,而不考虑乘法是一个恒定时间操作.对于人们进行数值计算的实际问题,我认为维基百科页面过于迂腐; 对于复杂性理论的关注,其正确性值得怀疑. (2认同)