数値誤差

atcoder.jp

を解いていての学び.

参考

drken1215.hatenablog.com

数値誤差

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);

    double a= 2.51;
    cout << (int) (a*100) << endl;

    return 0;
}
250

のように整数型にキャストした際に誤差が発生する可能性がある.上記の問題では入力 B を100倍して整数に変換し,整数同士の掛け算・割り算で解くことで AC できる.その100倍の方法は以下の2通り.

  1. 微小な値を加えて誤差回避
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);

    double b = 2.51;
    cout << (int) (b*100 + 0.0005) << endl;

    return 0;
}
  1. String 型で入力を受け取って変換
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);

    string s = "2.51";
    int b = (s[0] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0');
    cout << b << endl;

    return 0;
}

最終的な AC コード

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){

    ios::sync_with_stdio(false);
    cin.tie(0);

    ll a;
    string b;
    cin >> a >> b;
    ll ib = (b[0] - '0') * 100 + (b[2] - '0') * 10 + (b[3] - '0');

    ll ab = a*ib / 100;

    cout << ab << endl;

    return 0;
}