double类型的计算问题

img

为什么i=8时,y-x不等于z 求详细一点的解释!
就是麻烦用机器值去具体的计算一下 解释一下

img

浮点数存在精度误差,应该用两数相减取绝对值<一个极小的数的方法,而不是直接用==比较相等

浮点类型保存的是近似值,不能直接==比较。要比较一个近似值,比如a-b<1e-6可认为他们相等

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

    不能解决第一个问题,需要具体看代码实现才能得出结论。

    参考资料中的代码缺少变量声明和一些变量未初始化,无法直接使用。第二个问题需要先求出所有包子需要的时间,再按保留位数输出所需时间。下面给出代码实现:

    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    int main() {
        int x, y, z, x1, y1, z1, p;
        cin >> x >> y >> z >> x1 >> y1 >> z1 >> p;
        double time = (1.0 * x1 * y * z + 1.0 * y1 * x * z + 1.0 * z1 * x * y) / (1.0 * x * y * z);
        cout << fixed << setprecision(p) << time << endl;
        return 0;
    }
    

    第三个问题需要用递归实现汉诺塔算法,下面给出代码实现:

    #include <iostream>
    using namespace std;
    
    void hanoi(int n, char from, char to, char temp) {
        if (n == 1) {
            cout << from << "->" << to << endl;
        } else {
            hanoi(n-1, from, temp, to);
            cout << from << "->" << to << endl;
            hanoi(n-1, temp, to, from);
        }
    }
    
    int main() {
        int n;
        cin >> n;
        hanoi(n, 'A', 'C', 'B');
        return 0;
    }
    

    第四个问题需要用快速幂算法求$x^y$的最后三位小数,下面给出代码实现:

    #include <iostream>
    using namespace std;
    
    int pow_mod(int x, int y) {
        int res = 1;
        while (y) {
            if (y & 1) {
                res = res * x % 1000;
            }
            x = x * x % 1000;
            y >>= 1;
        }
        return res;
    }
    
    int main() {
        int x, y;
        cin >> x >> y;
    
        int res = pow_mod(x, y);
        printf("%03d\n", res);
        return 0;
    }
    

    第五个问题中,选择D选项无法正确计算y值,因为对于x等于0的情况,D选项没有给出正确的答案。正确的做法应该放在最后一个else语句中,即:

    #include <stdio.h>
    void main() {
        int x,y;
        scanf("%d",&x);
        if(x>-5 && x<0) {
            y=x-1;
        } else if(x>0 && x<8) {
            y=x+1;
        } else if (x==0) {
            y=x;
        } else {
            y=10;
        }
        printf("y=%d\n",y);
    }
    

    第六个问题中,add esp, 8的含义是将ESP寄存器加上8,即释放8个字节的内存空间。在函数调用中,局部变量的空间都是通过ESP寄存器进行分配和释放的,故此指令通常用于函数返回的清理工作中。

    第七个问题中,不了解雅奇MIS产品,无法进行具体解释。

    第八个问题需要对给定的x值进行分段计算y值,下面给出代码实现:

    #include <iostream>
    using namespace std;
    
    int main() {
        int x, y;
        cin >> x;
        if (x > -5 && x < 0) {
            y = x - 1;
        } else if (x == 0) {
            y = x;
        } else if (x > 0 && x < 8) {
            y = x + 1;
        } else {
            y = 10;
        }
        cout << "y=" << y << endl;
        return 0;
    }
    

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