horoyoisawaのゴミ箱

いろいろ書きます

浮動小数点リテラルに割り算を適用した際のバグ

要約

浮動小数リテラルを整数だと思って割り算すると死ぬのでやめようね。(当然)

 

概要

この問題を解いていた。

atcoder.jp

提出したコードがこちら。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. long long gcd(long long p, long long q) {
  5. if(p % q == 0) return q;
  6. else return gcd(q, p%q);
  7. }
  8.  
  9. int main() {
  10. long long a, b;
  11. cin >> a >> b;
  12. long long c = 1e18 / (a / gcd(a, b)); // 問題箇所
  13. if(b > c) cout << "Large";
  14. else cout << a / gcd(a, b) * b;
  15.  
  16. cout << '\n';
  17. return 0;
  18. }

 

このコードでは一つのケースでWAになる。そのインプットは

1000001 999999000001

で、期待される値と実際の値の比較は以下。

expected: 999999000000
realc:        999999000001

 

1e18を(long long)1e18とすればACになる。