『Cプログラミング診断室』目次次(第4章 キャストが好き 計算誤差)

第4章 キャストが好き

ムダな関数


では、他の問題点について見ていきましょう。まずは、関数intr(55〜63行)です。

この関数は、引数aをdouble型に変換し、標準関数のmodfで、小数部をdouble型のaaに、整数部 をdouble型で再びw1に求め、最後に、w1をキャストでfloat型にして関数の戻り値としています。

実際にこの関数が使われているのは、231行のif文で、

     if (intr(gminx) == intr(xd))
  
として、float型の2つの変数、gminxとxdの整数部分の一致検査をしています。2変数の整数部分 だけの比較に関数を用意し、その関数内部から、一般にはあまり使わない関数modfを呼んでいます。

私には、ちょっと信じられない関数の使い方です。まず、float型(あるいはdouble型)の整数部 分を取り出したいのなら、キャストすればいいのです。(int)gminxとすれば、整数部分が、整数型 で求められます。したがって、こういう時こそキャストを使い、

     if ( (int)gminx == (int)xd )
  
とすれば良いのです。これで、関数intrは、全く無用の長物であることが分かりましたね。削除し ましょう。もう、キャストを使うべきところで使わず、キャストが不要な所にいっぱい使って、困っ たものです。

ところで、浮動小数点数(double型)の整数への変換には、

(a) (int)によるキャスト
(b) 関数ceilによる切り上げ
(c) 関数floorによる切り捨て
の3通りがあります。なお、ceilとfloorは整数値化されたものがdouble型で得られます。その後 の計算が整数型で十分なときには計算効率は落ちてしまいます。あくまで、正しく切り上げ、切り 捨てをしたいときに使うとよいでしょう。図4−2に、3つの場合の整数化のされ方を示します。 なお、立派なコンピュータになると、四捨五入の関数が用意されていることもあります。

図4−2 関数による整数化のされ方の違い



Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第4章 キャストが好き 計算誤差)