gpt4 book ai didi

C++复合赋值和类型转换问题

转载 作者:行者123 更新时间:2023-11-30 01:35:06 25 4
gpt4 key购买 nike

我正在用 C++ 计算 combination(15, 7)。

  1. 我首先使用了以下代码,但由于 type promotion error 而得到了错误的答案.

    #include <iostream>

    int main()
    {
    int a = 15;
    double ans = 1;
    for(int i = 1; i <= 7; i++)
    ans *= (a + 1 - i) / i;
    std::cout << (int) ans;

    return 0;
    }

    输出: 2520

  2. 所以我将 ans *= (a + 1 - i)/i; 更改为 ans *= (double)(a + 1 - i)/i; 仍然得到错误的答案。

    #include <iostream>

    int main()
    {
    int a = 15;
    double ans = 1;
    for(int i = 1; i <= 7; i++)
    ans *= (double) (a + 1 - i) / i;
    std::cout << (int) ans;

    return 0;
    }

    输出: 6434

  3. 最后,我尝试了 ans = ans * (a + 1 - i)/i,它给出了正确的答案。

    #include <iostream>

    int main()
    {
    int a = 15;
    double ans = 1;
    for(int i = 1; i <= 7; i++)
    ans = ans * (a + 1 - i) / i;
    std::cout << (int) ans;

    return 0;
    }

    输出: 6435

谁能告诉我为什么第二个不起作用?

最佳答案

如果您打印出 ans 而不将其转换为 (int),您将看到第二个结果是 6434.9999999999990905052982270717620849609375。这非常接近 6535 的正确答案,所以这显然不再是类型提升错误。

不,这是经典floating point inaccuracy .当您编写 ans *= (double) (a + 1 - i)/i 时,您相当于:

ans = ans * ((double) (a + 1 - i) / i);

将此与第三个版本进行比较:

ans = ans * (a + 1 - i) / i;

前者先除法后乘法。后者从左到右运算,因此乘法先于除法。这种操作顺序的改变导致两者的结果略有不同。浮点计算对运算顺序极其敏感。

快速修复:不要截断结果; round它。

更好的解决方法:不要对整数运算使用 float 。保存除法,直到完成所有乘法。使用 longlong long,甚至是 big number library .

关于C++复合赋值和类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54837827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com