我通过在GNU C ++ 17中以不同的方式(几乎相似)进行相同的计算来获得不同的答案

问题描述 投票:0回答:2

我基本上是试图找到2与5e + 8除以3得到的商的乘积。我尝试了几种方法,如GNU C ++ 17的代码段所示,仅在方法2和方法4。我最初是希望这是一种溢出情况,但是一个有符号的int可以存储的最大数量略大于2e + 9,这比我正在处理的数字大得多,所以我认为可能是其他问题。如果有人可以提供帮助,那就太好了。在此先感谢:)

using namespace std;

int main(){

// I basically wan't to calculate: 2 * 500000000/3 ( 2 * 5e+8 / 3)

    // Approach 1
    cout<<2 * 500000000 / 3<<"\n";  // output : 333333333 (nine 3s) WRONG!

    // Approach 2
    int a = 500000000/3;    // output : 333333332 (eight 3s) CORRECT!
    cout<<2 * a<<"\n";

    // Approach 3
    a = 2 * 500000000/3;    // output : 333333333 (nine 3s) WRONG!
    cout<<a<<"\n";

    // Approach 4 
    cout<<500000000 / 3 * 2<<"\n";  // output : 333333332 (eight 3s) CORRECT!
}
c++17 integer-overflow
2个回答
1
投票

我们可以验证两个答案是否确实正确。


0
投票

操作顺序很重要。计算2 * 500000000 / 3时,它等于

© www.soinside.com 2019 - 2024. All rights reserved.