浮動小数点リテラルに割り算を適用した際のバグ
要約
浮動小数点リテラルを整数だと思って割り算すると死ぬのでやめようね。(当然)
概要
この問題を解いていた。
提出したコードがこちら。
- #include <bits/stdc++.h>
- using namespace std;
- long long gcd(long long p, long long q) {
- if(p % q == 0) return q;
- else return gcd(q, p%q);
- }
- int main() {
- long long a, b;
- cin >> a >> b;
- long long c = 1e18 / (a / gcd(a, b)); // 問題箇所
- if(b > c) cout << "Large";
- else cout << a / gcd(a, b) * b;
- cout << '\n';
- return 0;
- }
このコードでは一つのケースでWAになる。そのインプットは
1000001 999999000001
で、期待される値と実際の値の比較は以下。
expected: 999999000000
realc: 999999000001
1e18を(long long)1e18とすればACになる。