2013年2月10日日曜日

C言語で浮動小数点数の丸め、特に負の値

小数点以下を切り上げたり切り下げたりする話は、意外と疎かにされがちな(コードのお守りを押し付けられたりする)ので、今更ながら改めて整理しよう。

floor(x)
切り下げ。小数点以下がゼロでなければ、xより小さくxにもっとも近い整数を返す。
ceil(x)
切り上げ。小数点以下がゼロでなければ、xより大きくxにもっとも近い整数を返す。
round(x)
四捨五入。xにもっとも近い整数を返す。ちょうど2つの整数の中間だった場合(3.5とか)は絶対値が大きいほうを選ぶ。
(int) x
切り捨て。小数点以下がゼロでなければ、xより絶対値が小さくxにもっとも近い整数を返す。
手っ取り早く実例。

xfloor(x)ceil(x)round(x)(int) x
2.52.03.03.02
2.02.02.02.02
1.41.02.01.01
0.00.00.00.00
-1.4-2.0-1.0-1.0-1
-2.0-2.0-2.0-2.0-2
-2.5-3.0-2.0-3.0-2

floo()やceil()が符号を気にしないのに対して、round()や整数型へのキャストの挙動は正負対象となる。ハードウェアのCモデルを作る人は、ここらへんをきちんと考えながら書いてくれ。…って言うか、固定小数点のハードウェアモデルを書くのにdoubleとか使うなよ。

0 件のコメント:

コメントを投稿