用do- while求前n项和,不知道我哪里错了

求前20项和为23.597738。可我的结果是23.597742。我是哪里写错了吗

img

float全部改为double
float有效数字一共只有7位,你这答案都有8位,不算中间过程的误差,结果本身就已经不可信了
换句话说,你把23.597738直接赋值给y,再打印y,就已经不是这个数了

  • 这篇博客: 【算法总结】快速排序及边界问题分析中的 细节二:使用do-while在判断前先移动指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 考虑一个边界问题,为什么不能让i = lj = r然后使用while循环代替do-while循环?

    探讨一下写成如下形式会有什么问题

    while(q[i] < x) i++;
    while(q[j] > x) j--;
    

    若数组中存在重复的数字,某一轮可能存在**ij都指向重复的数字**,并且分界点x也是这个数字,上述两个while语句的判断就会结束循环,此时q[i] = q[j] = x,交换ij指向这个局面仍然不会改变,因此下一轮会重复这个过程,陷入死循环。

    因此,要确保每轮下来两个指针都至少会移动一步,保证上一次交换的结果不会再次判断。

    思路是,在判断while条件时,先移动指针。用do-while最容易实现这个思想,也可以用while实现:

    do i++; while(q[i] < x);
    do j--; while(q[j] > x);
    //等价于
    while(q[++i] < x);
    while(q[--j] > x);
    

    同时为了保证每轮下来边界lr都能被判断到,因此初始化要i = l - 1, j = r + 1使指针在数组两端之外。