为啥相同的代码相同的编译器在不同电脑上的运行结果不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥相同的代码相同的编译器在不同电脑上的运行结果不同?相关的知识,希望对你有一定的参考价值。

楼主忽略了  调用函数f1 时,c 没有赋初值就直接判断

在楼主程序的基础上略作修改

截图

win linux 两个平台  都测试过

参考技术A 1、机器有病毒了; 2、机器硬件出故障了; 3、不同的厂家如AMD/intel(基于兼容性大概率是不会的); 4、你找到硬件bug 了。 参考技术B 关键就是机器的不同,用机器各自的编译器来编译,结果就同了, 参考技术C 函数f1中的变量c,你在未初始化的情况下就使用了,就是这句while(c!=0)。这时c的值是不确定的。

为啥两个不同的编译器给出两个不同的结果?

【中文标题】为啥两个不同的编译器给出两个不同的结果?【英文标题】:why two different compilers are giving two different results?为什么两个不同的编译器给出两个不同的结果? 【发布时间】:2021-01-12 06:15:24 【问题描述】:

问题是找到数字 (1358)^n 的最后一位。我在 c++ 中使用了相同的方法和两个不同的编译器,但在 codeforces 上的两个编译器中的结果都不同。

编译器:clang c++17 诊断(代码已接受)但 GNU G++17 的判断是错误的_answer。

我不知道问题出在哪里,为什么两个编译器的结果不同?

n = [0, 1000000000]

测试用例:1000000000、32、33、36

正确答案:6、6、8、6

但使用 GNU 编译器:1、1、8、6

#include<bits/stdc++.h>
using namespace std;

int main()
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    double n; cin >> n;
    vector<long long> res 1, 8, 4, 2, 6 ;
    if (n <= 4)
        cout << res[n] << "\n";
    
    else
        while (n > 4)
            double x = log10(n)/log10(2);
            n = (ceil(x) == floor(x))? 4 : n - pow(2, floor(x));
        
        cout << res[n] << "\n";
    
    return 0;

【问题讨论】:

在您的问题中,您编写了 4 个测试输入(1000000000、32、33、36),但只有 3 个输出(预期为 6、6、8,实际上得到了 1、1、8)。还请添加平台(CPU 架构)和编译选项以帮助人们找到答案。 您的 while 循环是否应该类似于 n = n%4; if (n==0) n =4;?我想您的代码由于浮点舍入错误而失败 @HeroWanders 感谢您指出这一点!我现在已经更新了结果。 【参考方案1】:

我can't reproduce your problem,但这可能是由于浮点舍入错误(请参阅Is floating point math broken?)。

没有必要使用浮点数来解决这个问题。您似乎已经意识到最后一位数字遵循 8、4、2、6 的重复模式。要查找您正在使用该模式的哪个元素,您只需使用 n % 4

#include <iostream>
#include <vector>
#include <cmath>

int main() 
    for (int n : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32, 33, 36, 1000000000)
    
        std::vector<int> res 1, 8, 4, 2, 6 ;
        n = (n - 1) % 4 + 1;
        std::cout << res[n] << "\n";
    
    return 0;

【讨论】:

以上是关于为啥相同的代码相同的编译器在不同电脑上的运行结果不同?的主要内容,如果未能解决你的问题,请参考以下文章

Google colab 上的结果与本地结果不同

为啥 Arduino IDE 中的相同代码在不同的笔记本电脑上给出不同的输出?

求助:为啥我编的C++程序在自己电脑上能正常运行,但编译后挂在后台linux系统下就总是运行一半后出错,

为啥两次运行完全相同的正则表达式的结果不同? [复制]

为啥相同的 SQL 查询可能在 SQL Developer 和代码中返回不同的结果?

为啥我编译的MFC应用程序在其他电脑上不能运行?