在数学中,(实数)的加法是可交换的和关联的,即.对于所有数字x,y和z
x + y = y + x(交换性)
和
x +(y + z)=(x + y)+ z(相关性)
实数的乘法也是可交换和相关的.但这对于.NET中的int和浮点数是否正确?反例欢迎.
编辑:背景是我们最近并行化算法,现在它的结果在重复之间不再一致.我推测这可能是由于原子计算以非确定性顺序返回(并被合并).在这种情况下,可以通过更智能(但更慢)的合并算法(在合并之前对结果进行排序)来修复不一致性.我想知道它可以对.NET算法做出什么样的假设.
Tim*_* S. 10
假设没有发生溢出未选中,.NET的整数加法和乘法(int,long,等),是可交换并且关联,像数学中的实数.由于精度的限制,浮点算术(float和double)是可交换的,但并不总是精确关联的.来自维基百科(在文章中有一个例子):
虽然浮点加法和乘法都是可交换的(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)