2008年06月27日

負の値を含むときのfloatからintへの変換は注意が必要

floatからintへ変換すると、小数点以下が丸められます。このとき小数点以下の数字をどう扱うかについてはいくつか考え方がありますが、C++の場合は単純に切り捨てられます。

切り捨てというのは、言い方を変えると「0に向かって丸める」とも言います。10進表記で小数点以下が無かったことになります。一般的に小数点以下切り捨てと言ったら、この方法を指します。

この変換をグラフにしてみると、次のようになります。

intfloat.png

この図からも分かるように、正と負の値で丸められる向きが逆になり、値が0となる範囲だけが他よりも広くなっています。

この性質は、座標のような値を扱うときには注意しないといけません。例えばマウスカーソルの座標をパース変換してゲーム画面内の整数グリッド位置(チェス盤のマス目等)を計算する場合に、0の座標値を持つグリッドの幅が2倍になり、正と負の座標値で1マスずれることになります。

一方、70〜80年代に流行していたBASIC(主にMicrosoft製)では、浮動小数点数から整数への変換は床関数が使われていました。

床関数は、その数以下で最大の整数に変換されます。負の無限大に向かって丸めるとも言います。この方法では、正の値は切り捨てられ、負の値は切り上げられます。

床関数のグラフは次のようになります。

floorfloat.png

先ほどの切り捨てとは違い、0の周囲でも同じ規則でグラフが変化しています。

座標のような値の場合は、切り捨てよりも床関数の方が合っています。床関数ではfloatの値に+1したら変換後のintの値も必ず+1されますが、切り捨てではfloatの値が0を跨ぐときだけintの値が変化しません。

逆にオフセットのような値は、床関数よりも切り捨ての方が合っています。

2008年06月27日 【プログラミング】 | コメント(1) |

この記事へのトラックバック
この記事へのコメント

横軸がfloatで、縦軸がintですかね?
一般的には変換元が横軸で、変換先が縦軸ですから、恐らくそうなのだと思いますが、明確な説明が無いので考えてしまいます。

Posted by ueno at 2021年10月28日

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。