web-dev-qa-db-ja.com

round()とceil()が整数を返さないのはなぜですか?

時々、私はいくつかの数値を丸めることに気づき、常に結果を整数にキャストする必要があります:

_int rounded = (int) floor(value);
_

すべての丸め関数(ceil()floor())が整数ではなく浮動小数点数を返すのはなぜですか?私はこれはかなり直感的でないと思います、そしていくつかの説明が欲しいです!

59
Wookai

これらの関数によって返される整数値は、整数型(int、longなど)に格納するには大きすぎる場合があります。未定義の結果を生成するオーバーフローを回避するために、アプリケーションは戻り値を整数型に割り当てる前に、戻り値の範囲チェックを実行する必要があります。

ceil(3)Linux manページから。

66

これは、floatの範囲がintの範囲よりも広いためです。これらの関数から返された値がintに収まらなかった場合、何を期待できますか?これは未定義の動作であり、プログラムで確認することはできません。

28
sharptooth