佬佬们,为什么这个输出的是-3不是-3.5


#include 
int main(void){
    int djq(int a,int b);
    int x,n;
    float p;
    scanf("%d,%d",&n,&x);
    if(n>=0){
        switch(n){
            case 0:p=1;break;
            case 1:p=x;break;
            default:p=djq(n,x);break;
        }
        printf("%.2f",p);
    }
    else
    printf("error");
    return 0;
}
int djq(int n,int x){
    float p;
    switch(n){
            case 0:p=1;break;
            case 1:p=x;break;
            default:p=((2*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n;break;
        }
    return p;
}

img

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

这个程序的输出结果为 -3 而不是 -3.5 是因为使用整数除法导致精度丢失。在 djq 函数的最后,计算式子 (2*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n 时,如果 n 的值为 3,那么计算的结果将是 (5*x - djq(2,x) - 2*djq(1,x)) / 3,而 djq(2,x) 的值为 3,djq(1,x) 的值为 x,所以 (5*x - djq(2,x) - 2*djq(1,x)) / 3 的值实际上是 (5*x - 3 - 2*x) / 3,即 (3*x - 3) / 3,结果为 x - 1,而不是正确的结果 x - 1.5。

解决这个问题的方法是在计算式子时将整数转换为浮点数,这样就可以进行浮点数除法,避免精度丢失。修改后的 djq 函数如下:

float djq(int n, int x) {
    float p;
    switch(n) {
        case 0: p = 1; break;
        case 1: p = x; break;
        default: p = ((2.0*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n; break;
    }
    return p;
}

这样就可以正确输出 -3.5 了。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^