2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

1e18はlong long型の変数に格納する

Posted at

##結論
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;
}

##参照
浮動小数点数型と誤差

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?