##結論
long long a = 1e18;
と書きます。
##起きたこと
変数aが1e18を超えるか判定する文を書きたかった。
if(a > 1e18)
みたいに書いたのですが、aに1000000000000000001
が入った時にうまく分岐ができていないことに気づいた。
##原因
typeid(1e18).name()
で調べたところdoubleと返された。
1e18
は浮動小数点数であり、doubleの精度が大体15桁であることからこのようなことが起きたと考えられる。
1000000000000000000
と書けばこんな事例が発生することはないのだが、見にくいため書かない方が良いと思う。
1e18
と書いてlong longの変数に入れてあげるのが良いと考えた。
##コード
#include <iostream>
using namespace std;
int main()
{
long long a = 1e18;
long long b = 1000000000000000000;
long long e = 1000000000000000001;
cout << typeid(1e18).name() << endl;
cout << "1e18を変数に入れない" << endl;
cout << (1e18 < e) << endl;
cout << (1e18 > e) << endl;
cout << (1e18 == e) << endl;
cout << "1e18をlong long型の変数にいれる" << endl;
cout << (a < e) << endl;
cout << (a > e) << endl;
cout << (a == e) << endl;
return 0;
}
##参照
浮動小数点数型と誤差