2014年2月16日のブックマーク (1件)

  • absの罠

    こないだ、@kumagiさんがJubatusのクラスタリングのテスト書いたらNaNになるというので、デバッグしてたらabsにハマってたという恐ろしいバグを発見したので書いておきます。 C++で絶対値を求める関数は3つあります。 ::abs Cの関数でintを引数に取る ::fabs Cの関数でdoubleを引数に取る std::abs C++の関数でint引数とdouble引数でオーバーロードされている さて、大事なのは std::abs はオーバーロードされているので、doubleを渡すと::fabs相当の処理をしてくれる、ところが::absはCの関数なのでdoubleを渡してdoubleで結果を受け取ろうとすると、intにキャストして絶対値を計算してからdoubleに戻す、という恐ろしい挙動を示すことです。さて、std::absを呼んでるつもりで、absと書くとどうなるか。usingし

    NyaRuRu
    NyaRuRu 2014/02/16
    abs(INT_MIN) == INT_MIN なのもつらい……