dowhile循环跳出的情况异常

img

img


为什么我左边的查看列表里的“single_value”是0.43还符合28行的while条件,调试时却跳出了这个do while循环?谢谢各位了。
以下是代码:


#include<stdio.h>
#include<math.h>
double x_pow(double x,int n){
    int i,x_pow = 1;
    for(i = 1;i <= n;i++){
        x_pow *= x;
    }
    return x_pow;
}
int fact(int n){
    int sum = 1,i;
    if(n == 0||n == 1) return 1;
    for(i = 1;i <= n;i++){
        sum *= i;
    }
    return sum;
}
void x_sin(double x){
    int sign = 1,k = 1,count = 0;
    double sin = 0;
    double single_value = 0;
    do{ 
        single_value = x_pow(x,k)/fact(k);
        sin += sign*single_value;
        k += 2;
        sign *= -1;
        count++;
    }while(abs(single_value) >= 0.00001);
43    printf("%.3lf\n%d",sin,count);
}
int main(){
    double x;
    scanf("%lf",&x);
    x_sin(x);
    return 0;
}

abs返回值类型是int
改为fabs

第29行:while(abs(single_value) >= 0.00001); 实数求绝对值不是 abs()函数,应用fabs(),修改如下: while (fabs(single_value) >= 0.00001);

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于左侧查看列表中的“single_value”为0.43,符合第28行的while循环条件,但却在调试时跳出dowhile循环的情况,有可能是因为代码中涉及到浮点数的比较,而浮点数计算存在精度问题,导致条件判断结果与预期不符。

    解决方案: 1. 可以尝试将浮点数转换为整型进行比较,可以使用强制类型转换或者将浮点数乘以一个较大的整数再进行比较。 示例代码:

    int value = (int)(single_value * 100); // 将浮点数乘以100再转换为整型
    while(value <= threshold) {
        // do something
    }
    
    1. 在判断浮点数相等时,可以使用epsilon的方法,即判断两数的差值是否小于一个极小值,这个极小值通常取1e-9或者1e-10,根据实际情况灵活调整。 示例代码:
    double epsilon = 1e-9; // 设置极小值
    while(fabs(single_value - threshold) > epsilon) {
        // do something
    }
    
    1. 如果以上方法均无效,可以考虑采用其他循环方式,比如for循环或者while循环等,根据具体的逻辑和需求来选择合适的循环方式。

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