この数値の何故違う!?
最近また数値マジックを食らってしまった…。
こんな処理を
float a,b;
a=get_a();
b=get_b();
func_a(a-b);
func_b(a-b);
こうまとめたら…
float a;
a=get_a()-get_b();
func_a(a);
func_b(a);
ある入力の時に「a」が変な結果になる。
見付けるのに偉い苦労しましたょ!
この不具合を見ただけで分かる人は
物凄く苦労した人だけでしょう!(T_T)
分かるか!
で、こうしたら上手く行った。
double a;
a=get_a()-get_b();
func_a(a);
func_b(a);
微妙な所で「float」と「double」で差がデカかったりする。
ちなみに、以下の処理の結果を
分かる奴は居ないはず!
#include<stdio.h>
void main(void)
{
double x;
float a,b;
int r[3];
a=1.0f;
x=1.0;
a/=3;
x/=3;
b=(float)x;
r[0]=a==x;
r[1]=a==(float)x;
r[2]=(double)a==x;
r[3]=a==b;
printf("%d-%d-%d-%d\n",r[0],r[1],r[2],r[3]);
}
結果は、「0-0-0-1」
なぜぇ!?
ちなみにデバッガでは、以下のように数値が表示される。
a 0.333333
b 0.333333
x 0.33333333333333
だったら、「0-1-0-1」じゃあ?
確か、演算中の最大の型に合わせるのでは?
「a」を拡張しても「a=0.333333000000」になるのでは?
試しにデバッガ上では、以下の通りとなった…。
(double)a=0.33333334326744
(float)x=0.333333
これは、こう言うものらしい!?
取り敢えず、「float」や「double」には、バグが有る!
と言う事で、もし変な値が入ったら
この辺を疑おう!
| 固定リンク
コメント