改述问题:
以下代码(非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的内容吗?
答案 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方法更安全,你应该添加一个误差范围