【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日 追記
これ、指数表記は浮動小数点数になるからそこで誤差が発生して同じ数値に見えてるだけなのでは??????
最近のコメント