1

質問の言い換え :

次のコード (C++ ではない - 社内のスクリプト言語で記述)

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

の値が得られます

90989373681853939930449659398190196007605312719045829137102976436641398782862768335320454041881784565022989668056715169480294533394160442876108458546952155914634268552157701346144299391656459840294022732906509880379702822420494744472135997630178480287638496793549447363202959411986592330337536848282003701760.000000

D. については 100% 確信していA != 0.0ます。そして、ほぼ 100% 確信していB == 0.0ます。Bこの の値がC示唆するの値のような非常に小さい値 (0.0 に近いが 0.0 ではない) は使用しません。私たちのデータからその値を取得することは不可能です。が 0A*Bの場合、0.0 に等しくないものを生成できますか?B

4

3 に答える 3

2

割った数は実際には 0 ではありませんでした。非常に近いだけです。

于 2010-11-24T04:31:14.897 に答える
1

IEEE 浮動小数点数を使用していると仮定すると、この場合、浮動小数点数で等しいか等しくないかを使用することはお勧めできません。-0.0 と +0.0 のような同じ値であっても、equate が行うビット単位の観点からは等しくありません。他の float 形式を使用している場合でも、equal と not equal は推奨されません。

代わりに、ある種の範囲を e=a*b; に置きます。もし ((e<0.0002)||(e>0.0002) なら...

于 2010-11-25T00:47:53.577 に答える
0

これは、以前の計算からエラーが発生しているように見えるため、除算は非常に小さな小数ですが、ゼロではありません。この psuedocode:if(num < margin_of_error) ret inf;のようなものをキャッチしたい場合は、エラーの範囲を追加するか、さらに安全にするためにイプシロン メソッドを使用する必要があります。

于 2010-11-24T04:47:30.997 に答える