当前位置: 首页 > 知识库问答 >
问题:

Neo4j浮点求和不同结果

熊烨
2023-03-14

我正在使用neo4j来计算一个数据集上的一些统计数据。为此,我经常在浮点值上使用sum。我得到不同的结果取决于环境。例如,执行以下操作的查询:

...
WITH foo
ORDER BY foo.fooId
RETURN SUM(foo.Weight)
...
RETURN SUM(foo.Weight)

差别很小(293.07724195098984293.07724195099007)。但使简单的等式检查失败就足够了。另一个例子是数据库的不同实例,使用相同的加载过程加载相同的数据可能会产生相同的问题(dbs可能不是1:1,某些关系的加载顺序可能不同)。我取了neo4j求和的原始值(通过简单地移除sum()),并验证它们在所有情况下都是相同的(不同的dbs和已排序/未排序)。

我有什么选择?我并不介意丢失一些精度(我已经尝试将精度从小数点后15位降低到12位,但这似乎不起作用),但我需要结果来匹配。

共有1个答案

严扬
2023-03-14

由于舍入误差,浮动不是关联的。(a+b)+c!=a+(b+c)。
每个操作的结果都四舍五入以符合浮点编码约束,并且(a+b)+c实现为round(round(a+b)+c),而a+(b+c)实现为round(A+round(b+c))。

作为一个明显的说明,考虑操作(2^-100+1-1)。如果解释为(2^-100+1)-1,它将返回0,因为1+2^-100对于浮点或IEEE754中的双重编码要求的精度太大,并且只能编码为1.0。While(2^-100+(1-1))正确返回可以用浮点或双值编码的2^-100。
这是一个简单的示例,但这些舍入错误可能在每次操作后都存在,并解释了为什么浮点操作不是关联的。

数据库通常不会以gareted顺序返回数据,根据实际的顺序,操作将以不同的方式进行,这就解释了您的行为。

通常,由于这个原因,对浮点进行相等比较不是一个好主意。通常,建议将A==B替换为abs(a-b)“足够”小。
“足够”可能取决于您的算法。浮点数相当于6-7个小数,倍数为15-16个小数(我认为这是在您的DB上使用的)。根据计算次数的不同,您可能会影响最后1-3个小数。
最好的方法可能是使用
abs(a-b) ,其中必须根据您的问题调整相对误差。可能10^-13左右的值是正确的,但您必须进行实验,因为舍入误差取决于计算的次数、值的离散度以及您认为问题“相等”的值。

看看这个站点关于比较方法的讨论。阅读David Goldberg的《每个计算机科学家应该知道的浮点算术》,其中讨论了这些问题。

 类似资料:
  • 我不明白为什么浮点值与双精度值不同。从下面的示例来看,对于相同的操作,float 提供的结果似乎与双精度型不同: 输出: 你能解释一下float和double之间的区别吗?

  • 我正致力于直接在戈朗开发一个技术指标库。除其他外,这是学习戈朗语的练习。 我一直在验证我的算法的结果,方法是用TA-Lib(或者更确切地说是TA-Lib的ruby包装器)生成的数据构建测试用例。 上面的问题涉及浮点数学的一个非常简单的表现形式。很难确认一段较长的代码是否真的解决了这个问题。 我如何确认它只是浮点数学的变体,因为顺序? /结束编辑

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 5年前关闭。 我必须将两个整数相除并得到一个浮点数作为我的代码: 我用调试器检查值 为什么结果为0.0?我应该怎么做才能获得正确的浮动? 问题答案: 当您将两个数相除时,将执行整数除法,在这种情况下,将导致22/64 =0。只有完成此操作后,您才能创建一个。和的表示是。如果要执行浮点除法,则应 在 除法 之前进行 强制转换:

  • 我需要一个regex来匹配这两个整数值和浮点数(而浮点数有一个“.”作为分离器)。这些数字总是在一个括号中,可能有一个前导的“+”。 什么应该是有效的: null 什么应该是无效的: 1.0---因为没有括号 5---因为没有括号 (1,5)---becaue“,”而不是“.” (a)---因为不是一个数字 (1.5)--因为不仅仅是一个数字 (1+5)---因为...嗯...只是失败了 [5]-

  • 问题内容: 我知道浮点数学充其量可能很难看,但我想知道是否有人可以解释以下怪癖。在大多数编程语言中,我测试了0.4到0.2的添加会产生轻微的错误,而0.4 + 0.1 + 0.1会给出非错误。 计算不均的原因是什么,人们可以在相应的编程语言中采取什么措施以获得正确的结果。 在python2 / 3中 在Julia 0.3中也是如此 和Scala: 和Haskell: 但是R v3正确了: 问题答案