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

4

3 回答 3

2

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

于 2010-11-24T04:31:14.897 回答
1

假设您使用的是 IEEE 浮点数,在这种情况下使用等于或不等于浮点数并不是一个好主意。即使像 -0.0 和 +0.0 这样的相同值,从按位角度来看它们也不相等,这就是等价的作用。即使使用其他浮点格式,也不鼓励使用 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;或者使用 epsilon 方法更安全

于 2010-11-24T04:47:30.997 回答