実数と整数の変換
情報制御基礎で出題した問題で、5点の移動平均の処理の一部に、以下のコードがあった場合の間違い説明の問題。
int avg() { int s = .... ; return (1/5) * s ; }
の間違いを修正せよ….の答えだけど、return 0.2 * s ; とか return s/5 ; が答えだけど、小数点以下が切り捨てになるのか、四捨五入になるのか気になってきた。
for( double x = 0.0 ; x <= 2.0 ; x += 0.1 ) printf( "%ld %d\n" , x , (int)x ) ;
で確認してみたら、(int)実数は、小数点以下切り捨てだな。となると、四捨五入したいなら、return (int)( 0.2 * s + 0.5 ) ; とか、return (s+2)/5 ; とか書いてほしい…とか微妙な話になるな。
採点は、切り捨て・四捨五入の誤差については問わないで、0.2*s , s/5 を◯でいこう。