« 最近、MicMacしています…。 | トップページ | ボケも歩くと夏祭り? »

2006年7月30日 (日)

この数値の何故違う!?

最近また数値マジックを食らってしまった…。

こんな処理を

    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」には、バグが有る!
と言う事で、もし変な値が入ったら
この辺を疑おう!

|

« 最近、MicMacしています…。 | トップページ | ボケも歩くと夏祭り? »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: この数値の何故違う!?:

« 最近、MicMacしています…。 | トップページ | ボケも歩くと夏祭り? »