我有一个程序,在图中寻找路径并输出累积权重。图中所有边缘的个体权重为0至100,为浮点数,最多有两位小数。
在Windows/Visual Studio 2010上,对于由0权重边缘组成的特定路径,它将正确的总权重输出为0。然而,在Linux/GCC上,该程序说这条路径的权重为2.35503e-38。我有很多经验,这些经验都是由于浮点数引起的疯狂错误,但何时0 + 0会等于除0以外的其他结果呢?
我唯一能想到的可能引起这种情况的原因是程序将某些权重视为整数,并使用隐含的强制转换将它们添加到总和中。但是,0 + 0.0f仍然等于0.0f!
作为一个快速修复,当小于0.00001时,我将总数减少到0,这对我的需求已足够。但是,是什么造成了这种魔法呢?
注意:我非常有信心图形中没有任何超出我提到的范围的权重,并且在这条特定路径中所有的权重都是0。
编辑:详细说明一下,我已经尝试从文件中读取权重并在代码中手动设置它们等于0.0f。除将它们添加到总和中之外,没有进行任何其他操作。
在Windows/Visual Studio 2010上,对于由0权重边缘组成的特定路径,它将正确的总权重输出为0。然而,在Linux/GCC上,该程序说这条路径的权重为2.35503e-38。我有很多经验,这些经验都是由于浮点数引起的疯狂错误,但何时0 + 0会等于除0以外的其他结果呢?
我唯一能想到的可能引起这种情况的原因是程序将某些权重视为整数,并使用隐含的强制转换将它们添加到总和中。但是,0 + 0.0f仍然等于0.0f!
作为一个快速修复,当小于0.00001时,我将总数减少到0,这对我的需求已足够。但是,是什么造成了这种魔法呢?
注意:我非常有信心图形中没有任何超出我提到的范围的权重,并且在这条特定路径中所有的权重都是0。
编辑:详细说明一下,我已经尝试从文件中读取权重并在代码中手动设置它们等于0.0f。除将它们添加到总和中之外,没有进行任何其他操作。
assert(weight == 0.0f)
。 - Emile Cormierx * 0 == 0
。如果sum(xi) != 0
,那么就存在xi != 0
。这可以通过采取逆否命题来证明。因此,我在数学上证明了其中一个权重实际上不为零。 :P - Emile Cormier1e-40
到1e-30
范围内的值。如果您在路径中有任何其他非空值,则未初始化的值将是可以忽略的。 - rodrigo