具有除法的表达式的意外结果

时间:2013-04-26 15:11:12

标签: c

我必须编写一个计算并显示以下表达式的程序:

P=(1/2-3/4)*(5/6-7/8)*...*[n/(n-1) - (n+2)/(n+3)]

我这样做了,我跑了它,它没有显示任何错误。当我运行它时,对于我输入的每个值,它显示P = 0。有什么问题?

#include <stdio.h>

int main (void)
{
    float s, p=1.0;
    int i, n;
    printf("Enter a number:");
    scanf("%d", &n);
    for (i=1;i<=n;++i) { 
        p*=((i)/(i+1)-(i+2)/(i+3));
    }
    printf("p=%f\n", p);
}

4 个答案:

答案 0 :(得分:6)

您使用的是整数运算而不是浮点运算,因此除法运算将被截断。

变化:

p*=((i)/(i+1)-(i+2)/(i+3));

为:

p*=((float)(i)/(i+1)-(float)(i+2)/(i+3));

答案 1 :(得分:2)

它不起作用,因为i是整数:当您划分(i)/(i+1)(i+2)/(i+3)时,在两种情况下都会得到零,因为当i为正时,分母大于分子。零减零为零,p次零为零,所以这就是你得到的。

要解决此问题,请将i声明为float

#include <stdio.h>
int main ()
{
    float s,p=1.0, i;
    int n;
    printf("Put a number:");
    scanf("%d",&n);
    for (i=1;i<=n;++i) { 
        p*=((i)/(i+1)-(i+2)/(i+3));
    }
    printf("\n p=%f",p);
    return 0;
}

答案 2 :(得分:2)

您使用的是int个变量,而不是float个变量,因此i/(i+1)(i+2)/(i+3)将始终评估为0,因为它是整数除法。

只需使用一些强制转换来强制使用浮点算术进行评估:

((float)i)/(i+1)-((float)i+2)/(i+3)

答案 3 :(得分:1)

你的问题是整数除法截断而不是返回你看起来正在寻找的浮点结果:

 i/(i+1)

 (i+2)/(i+3)
C中的

总是0