为什么除法(?)会产生这个数字?

时间:2010-11-24 04:28:42

标签: c++ floating-point division divide-by-zero

改述问题:

以下代码(非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。我们从不使用这种无限小的值(接近0.0但不是0.0),例如B的值C所暗示的值A*B。它不可能从我们的数据中获得这个价值。当B为0时,{{1}}可以产生任何不等于0.0的内容吗?

3 个答案:

答案 0 :(得分:2)

你除以的数字是不是实际上是0,非常非常接近。

答案 1 :(得分:1)

假设您正在使用IEEE浮点数,在这种情况下使用等于或不等于浮点数不是一个好主意。即使像-0.0和+0.0这样的相同值,它们也不是从等位的角度来看是等同的。即使使用其他浮点格式,也不鼓励使用相等且不相等的格式。

而是在其上放置某种范围e = a * b;如果((e <0.0002)||(e> 0.0002)那么...

答案 2 :(得分:0)

这看起来像是你从之前的计算中产生错误,所以你的divison是一个非常小的小数,但不是零。如果你想捕获像这样的东西,psuedocode:if(num < margin_of_error) ret inf;,或者使用epsilon方法更安全,你应该添加一个误差范围