2010-11-24 10 views
1

言い換え質問:部門(?)がこの番号を生成するのはなぜですか?

次のコード(未C++ - 社内のスクリプト言語で書かれた)

if(A*B != 0.0) 
{ 
    D = (C/(A*B))*100.0; 
} 
else 
{ 
    D = 0.0; 
} 

は、私たちがしているD.のため

90989373681853939930449659398190196007605312719045829137102976436641398782862768335320454041881784565022989668056715169480294533394160442876108458546952155914634268552157701346144299391656459840294022732906509880379702822420494744472135997630178480287638496793549447363202959411986592330337536848282003701760.000000

の価値を生み出します100%確実にA != 0.0。そして、私たちはほぼ100%がB == 0.0と確信しています。この値がCであるBという値のように、極端に小さい値(0.0に近い値で0.0ではなく)を使用することはありません。私たちのデータからその価値を取得することは不可能です。 A*Bは、Bが0の場合に、0.0と等しくないものが得られますか?

+0

これはC++ではない場合、なぜC++タグを持っていますか?(もちろん、どのように人々ができると期待していますか?あなた自身の社内スクリプト言語の仕組みを説明する);)) – jalf

答えて

2

あなたが割り算した数値は、ではありません。実際にはではありません。ちょうど非常に非常に近いです。

+0

これはケースです:( – nakiya

0

これは以前の計算の誤差が発生しているように見えます。したがって、除算は実際には小さい小数ですが、ゼロではありません。このようなコードを取得したい場合は、擬似コード:if(num < margin_of_error) ret inf;を追加するか、εメソッドを使用してさらに安全にしてください。

1

IEEE浮動小数点数を使用していると仮定すると、この場合浮動小数点数と等しくないかどうかを判定します。 -0.0と+0.0のような同じ値であっても、ビット単位の観点からは等しくなく、これは等価と同じです。他の浮動小数点フォーマットを使用しても、等しくないか等しくないのはお勧めしません。

代わりに、ある種の範囲をe = a * bとします。0.0002)||(e> 0.0002)then ...

関連する問題