« yumコマンド | トップページ | WindowsとLinuxをシームレスに!「andLinux」 »

2008/02/25

忘れちゃいけないキャスト

私がよくつまづくキャストについて。

例えば15!を計算するときに次のように記述したとします。

double ans = 0;
ans = 15*14*13*.......*2*1;

階乗計算としては全く問題がないように見えますが、これには大きな間違いがあります。実際にコンパイルして実行すると15!の答えである1307674368000は出力されません。(JavaでもCでも2.00.....E09、つまり2.00....×10の9乗と出力されるはず)

なぜなら、右辺に書かれた数値リテラルをint型として捉え左から順に計算しているためにint型の最大値を超過、すなわちオーバーフローを起こしています。さらに、JavaやCではオーバーフローを起こしてもエラーや例外が発生しません。(コンパイラオプションに-Wallなどを加えておけば警告をだしてくれます)

これを防ぐには次のようにしっかりキャストしておく必要があります。

double ans = 0;
ans = (double)15*14*13*.......*2*1;

(Javaでは(double)15ではなく15dとすることもできます。)

もちろん、

double ans2 = 1;
for(i=15 ; i>=1 ; i--)
ans2 *= i;

とすれば正しく階乗計算をすることができます。

|

« yumコマンド | トップページ | WindowsとLinuxをシームレスに!「andLinux」 »

C」カテゴリの記事

Java」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/222903/40259780

この記事へのトラックバック一覧です: 忘れちゃいけないキャスト:

« yumコマンド | トップページ | WindowsとLinuxをシームレスに!「andLinux」 »