不同计算机上运行的C++程序结果不同

3

我的代码对于输入的100打印出了192(这是期望的结果)。但当我将其提交到在线评测机上时,它显示我的程序对于输入的100的输出为190。我将代码复制粘贴到ideone.com上,对于输入的100,我得到了结果192。我将其发送给我的朋友,在他的PC上输出为190。但是他也将代码提交到ideone.com上,得到了192。问题在哪里?以下是我的代码:

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

typedef long long int lli;

int main(){
   lli in,ans = 0;
   cin >> in;

   if(in < 10)
       cout << in << endl;
   else{
      lli digits = 0;
      lli temp = in;
      while(temp > 0){
         digits++;
         temp /= 10;
      }
     digits--;

     while(in > 0){
         //cout << "in: " << in << endl;
         //cout << "digits: " << digits << endl;

         ans += ((in - (pow(10,digits) - 1)) * (digits + 1));
         in = in -  (in - (pow(10,digits) - 1));
         digits--;

         if(in == 9){
            ans+= 9;
            break;
         }
      } 
      cout << ans << endl;
   }
}

ideone链接:http://ideone.com/zOvHzW

为什么会发生这种情况?我知道可能是编译器问题,但实际上到底发生了什么?


顺便提一下,不要使用#include <bits/stdc++.h> - Cory Kramer
为什么不包含 <bits/stdc++.h>? - Redwanul Sourav
点击Cory的评论中的链接。 - NathanOliver
我发现在第一次迭代(当in100时),一些编译器将in = in - (in - (pow(10,digits) - 1));计算为98,而另一些则计算为99(这是正确的)。我不确定原因是什么,我认为这可能与优化有关,但我不确定。 - PcAF
我写了一个自定义的幂函数,解决方案被接受了!pow()函数有什么问题?当我调用pow()时发生了什么?我解决了这个问题,但我仍然不知道这里出了什么问题。 - Redwanul Sourav
显示剩余3条评论
1个回答

1
问题在于std::pow不是精确的,它是一种近似算法。它返回的浮点数结果可能会有一些非常微小的偏差。
当您将浮点数转换为整数时,通过删除小数部分将其向下舍入。但是,如果正确的结果应该是100,而误差是-0.000...001,因此结果是99.999...999,并且您截去小数部分,则得到的整数是99。
如何实现std::pow是...特定于实现者。因此,在一个编译器/计算机中,错误可能是一种方式,而在另一个编译器/计算机中则是另一种方式。这就是为什么结果可能会有所不同的原因。
解决方案:不要在整数计算中使用std::pow
解决方法:先将结果四舍五入到最近的整数。

@RedwanulSourav 不用谢,这就是点赞按钮的作用。别忘了将最有帮助的答案标记为已接受 :) - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接