【发布时间】:2013-10-21 22:56:40
【问题描述】:
在数学中,(实数的)加法是可交换的和结合的,即。对于所有数字 x、y 和 z
x + y = y + x(交换律)
和
x + (y + z) = (x + y) + z(关联性)
实数的乘法也是可交换的和结合的。但是对于 .NET 中的整数和浮点数来说,这是真的吗?欢迎反例。
编辑:背景是我们最近并行化了一个算法,现在它的结果在重复之间不再一致。我推测这可能是由于原子计算以不确定的顺序返回(并被合并)。在这种情况下,可以通过更智能(但更慢)的合并算法(在合并之前对结果进行排序)来修复不一致。我想知道它可以对 .NET 算术做出哪些假设。
【问题讨论】:
-
DV 看起来有点极端,但你到底想解决什么问题呢?
-
坚持“我不知道我在说什么,但无论如何我都会就这个主题发表我的看法”,我想说它适用于整数,但不是必须为花车。至少这是我对浮点运算的直觉。
-
在任何语言中,都遵循基本的数学规则。对于整数来说,交换性、关联性以及加法的置换性确实应该在数值舍入精度的限制内尊重浮点数。
-
另外,您对并行化(我假设是指多线程)的评论可能表明存在完全不同的问题。也许您有竞争条件或需要更好锁定的非原子操作。