2014年2月15日土曜日

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していればもちろんstd::absになりますが、そうでない場合には::absになる可能性があります。すると、渡されたdobule値はintにキャストされて、華麗にオーバーフローして、もう残りは目も当てられません。 素直にfabsを使うか、absを使うときは必ずstd::absと面倒でも明示的に書くのがいいようです。不正確なabsという書き方はほんとうに怖いので、grep "[^:f]abs(" で簡単にチェックできるので、活用するのをおすすめします。

サンプルコード

2014年2月11日火曜日

Statistical Semantics入門の発表をしました

先週のPFIセミナーで、Statistical Semantics入門という発表をしました。 主に分布仮説をベースにした、単語の意味を文脈の分布で表現する研究を纏めました。 LSIから始まって、PLSI、LDAと続く言語モデル系、NMFなどの行列分解系、そしてNNLM、RNNLMと来て昨年流行したニューラルネット系の3つでまとめるという形をとっています。 あまり専門的になりすぎず、過去からの歴史や流れを踏まえ、一方で実用面や研究テーマのココロ、問題意識を重視するような内容になるように心がけたつもりではあります。 当初、他の「いわゆる意味論」との比較みたいなスライドもあったのですが、変なコト言うと刺されると思ったので消しましたw