|
分類:[雑談]
いつもお世話になっています。
私がコーディング中に気がついた float型を使用する際の注意するべき精度の問題を 問題形式であげておきます。
.NETのC++でコーディングしております。
以下のプログラムの(1)〜(6)までは、すべて通ると思いますか? ぱっとみはすべてブレイクポイントを張れば止まりそうですが、 実は止まらない場所があります。
どういう結果になるか想像した後、 一度実行してみて体験してみてください。 ちなみにご存じかとは思いますが、
2.1f はfloat型 2.1 はdouble型
をそれぞれ指します。
お時間があるときに実験してみてください。
float a = 2.1f; int b = (int)(a*10.0f); int c = (int)((double)a*10.0);
if(21 == b) { Sleep(0); // (1) }
if(21 == c) { Sleep(0); // (2) }
if(2.1f == a) { Sleep(0); // (3) }
if((float)2.1 == a) { Sleep(0); // (4) }
if(2.1 == (double)a) { Sleep(0); // (5) }
if(2.1 == a) { Sleep(0); // (6) }
予想と実験してみた感想を書き込んでいただければ幸いです。
|