C++の割り算切り上げ(ceil関数)でハマった - 9月 17, 2018 こんにちは、ぐぐりら(@guglilac)です。 ## 症状 xをTで割って切り上げる処理を行ったときに、 以下の二つが等しくならない時があった サンプルケースではなかったのでどの入力でなっているのかわからんかった ```c++ std::ceil((double)x / T) (x + T - 1) / T ``` xもTもlong long。 ## 型を調べる まず、型を調べる方法を知らずに、出力してみたときの表示を見て型を推定していたのが間違いだった。 double型を出力したら1.0というような形式で出力されると思い込んでいた。 実際には、以下を実行すると、出力は1.0ではなく1になる。 ```c++ double hoge = 1.0; std::cout << hoge << '\n'; ``` ceil関数の返り値も出力してみると整数で表示されたので、てっきり整数型で返ってきているのかと思ったけど、普通にdoubleだった。 ドキュメントにはもちろんdoubleが返ってくると書いてある。あほすぎる。 ちなみに、型を調べるのはこんな感じでかけるみたいなので、今後積極的にデバッグに使っていきたい。 ```c++:型の調べ方 double hoge=1.0; std::cout << typeid(hoge).name() << '\n'; ``` ## 解決 なので、ceilはdoubleを返すので、返り値が大きくなるとオーバーフローする。 ```c++ typedef long long ll; ll x = 10000000000000; ll T = 3; std::cout << std::ceil((double)x / T) << '\n'; std::cout << (x + T - 1) / T << '\n'; ``` ``` 3.33333e+12 3333333333334 ``` ceilをllで包めば一致する ```c++ ll(std::ceil((double)x / T)) == (x + T - 1) / T//=> true ``` まあでも普通に ``` (x + T - 1) / T ``` てすればいいんだけど。 切り上げて整数が欲しいっていうモチベなのに、doubleが返ってくるのはどういう。。。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿