指数在C中无法正常工作

时间:2014-04-16 17:51:00

标签: c exponent

当我运行以下代码时

/*Program to find the greatest common divisor of two nonnegative integer
 values*/


#include <stdio.h>

int main(void){
    printf("    n  |  n^2\n");
    printf("-----------------\n");
    for(int n = 1; n<11; n++){
        int nSquared = n^2;
        printf("%i          %i\n",n,nSquared);
    }
}

返回终端的表显示如下

    n  |  n^2
-----------------
1          3
2          0
3          1
4          6
5          7
6          4
7          5
8          10
9          11
10          8

为什么“n ^ 2”侧产生错误的数字?有没有办法在C中编写上标和下标,所以我不必显示“n ^ 2”并且可以将列的那一侧显示为“n²”而不是?

4 个答案:

答案 0 :(得分:6)

使用pow中的math.h功能。

^是按位异或运算符,与幂函数无关。

答案 1 :(得分:2)

^是XOR操作。您要么使用math.h函数“pow”,要么自己编写。

答案 2 :(得分:0)

^是按位xor运算符。您应该使用pow标头中声明的math.h函数。

#include <stdio.h>
#include <math.h>

int main(void) {
    printf("    n  |  n^2\n");
    printf("-----------------\n");
    for(int n = 1; n < 11; n++){
        int nSquared = pow(n, 2); // calculate n raised to 2
        printf("%i          %i\n", n, nSquared);
    }
    return 0;
}

通过标志-lm包含数学库以进行gcc编译。

答案 3 :(得分:0)

正如其他人所指出的,问题是^是按位xor运算符。 C没有取幂运算符。

建议您使用pow()函数计算int值的平方。

这可能有用(如果你小心),但这不是最好的方法。 pow函数接受两个double个参数并返回double个结果。 (有powfpowl函数分别在floatlong double上运行。)这意味着pow必须能够处理任意浮动 - 点指数;例如,pow(2.0, 1.0/3.0)将为您提供两个立方根的近似值。

与许多浮点运算一样,pow可能会出现舍入错误的可能性。 pow(3.0, 2.0)可能产生的结果略低于9.0;将其转换为int将为您提供8而不是9。即使你设法避免这个问题,从整数转换到浮点,执行昂贵的操作,然后转换回整数是大量的矫枉过正。 (实现可能使用整数指数优化对pow的调用,但我不会指望它。)

有人说(略带夸张)过早优化是所有邪恶的根源,而进行额外计算所花费的时间不太可能引人注目。但在这种情况下,有一种方法可以做你想要的更简单,更有效的方法。而不是

int nSquared = n ^ 2;

不正确,或

int nSquared = pow(n, 2);

这是低效的,可能不可靠,只需写:

int nSquared = n * n;