算术可交换和关联吗?

Col*_*nic 5 .net c# math

在数学中,(实数)的加法是可交换的和关联的,即.对于所有数字x,y和z

x + y = y + x(交换性)

x +(y + z)=(x + y)+ z(相关性)

实数的乘法也是可交换和相关的.但这对于.NET中的int和浮点数是否正确?反例欢迎.

编辑:背景是我们最近并行化算法,现在它的结果在重复之间不再一致.我推测这可能是由于原子计算以非确定性顺序返回(并被合并).在这种情况下,可以通过更智能(但更慢)的合并算法(在合并之前对结果进行排序)来修复不一致性.我想知道它可以对.NET算法做出什么样的假设.

Tim*_* S. 10

假设没有发生溢出未选中,.NET的整数加法和乘法(int,long,等),是可交换并且关联,像数学中的实数.由于精度的限制,浮点算术(floatdouble)是可交换的,但并不总是精确关联的.来自维基百科(在文章中有一个例子):

虽然浮点加法和乘法都是可交换的(a + b = b + a和a×b = b×a),但它们不一定是关联的.即,(a + b)+ c不一定等于a +(b + c).

这是一个例子:

a: 0.825402526103613
b: 0.909231618470155
c: 0.654626872695343
(a*b)*c: 0.491285733573819
a*(b*c): 0.49128573357382
Run Code Online (Sandbox Code Playgroud)

有一些例子,当变成a时结果看起来相同string,但是不同((a*b)*c != a*(b*c)true,并且(a*b)*c - a*(b*c)返回一个小值,而不是0).

a: 0.613781429181705
b: 0.648859122604532
c: 0.795545351596337
(a*b)*c: 0.316832045751117
a*(b*c): 0.316832045751117
difference: 5.55111512312578E-17
Run Code Online (Sandbox Code Playgroud)

  • 未经检查的溢出实际上不会破坏交换性或关联性(对于整数,浮点数是一个不同的故事).但是检查过溢出. (2认同)