2010年5月12日水曜日

floatをキャストするととんでもないことになるVC2008



VC2008の32bit版では以下のようになります。超絶注意。



(int)((float)INT_MAX)<0



floatは仮数が24bitしかないので、INT_MAXが丸められてfloatではINT_MAX+αになる。


そこまでいい。


それをintにキャストするとき、にビットがあふれて負の値になってしまいます。


つまり、VC2008だとINT_MAX付近のでかい数値を使うとき、floatからintへのキャストは危険です。


キャストする前に桁あふれしないかをチェックする必要があるってことですね。


たぶん、0x7ffffff8より大きい時に注意すればなんとかなるとおもう。


ちなみにgccのときはfloatにINT_MAXより大きい値が入っている場合はINT_MAXにクランプされるようです。


こっちのほうが直感的でミスったとき安全だとおもうんだけどなぁ。。。





0 件のコメント:

コメントを投稿