【C++】128bit整数に対する比較演算

C++に__int128っていう拡張整数型があったから使ってみたけど、数値比較のときに罠があったよ~~~~っていうメモ的な。指数と比較すると死ぬよっていうあれ

#include <iostream>
  
using int128_t = __int128;
using uint128_t = unsigned __int128;
auto main()->int{
  std::cout << std::boolalpha << "1000000000000000000 == 1e18 : " << (1000000000000000000 == 1e18) << std::endl;
  {
    int128_t over = 1000000000000000000 + 1;
    std::cout << std::boolalpha << "1000000000000000000 + 1 > 1000000000000000000 : " << (over > 1000000000000000000) << std::endl;
    std::cout<< std::boolalpha << "1000000000000000000 + 1 > 1e18 : " << (over > 1e18) << std::endl;
  }
  {
    uint128_t over = 1000000000000000000 + 1;
    std::cout << std::boolalpha << "1000000000000000000 + 1 > 1000000000000000000 : " << (over > 1000000000000000000) << std::endl;
    std::cout << std::boolalpha << "1000000000000000000 + 1 > 1e18 : " << (over > 1e18) << std::endl;
  }
}
// 出力
// $ g++ -o test -std=c++2a test.cc
// $ ./test
//   1000000000000000000 == 1e18 : true
//   1000000000000000000 + 1 > 1000000000000000000 : true
//   1000000000000000000 + 1 > 1e18 : false
//   1000000000000000000 + 1 > 1000000000000000000 : true
//   1000000000000000000 + 1 > 1e18 : false

2020年12月27日 追記

これ、指数表記は浮動小数点数になるからそこで誤差が発生して同じ数値に見えてるだけなのでは??????

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です