c# - 相关性数学:(a + b)+ c!= a +(b + c)




3 Answers

一个例子

a = 1e-30
b = 1e+30
c = -1e+30
c# .net math numeric

最近我正在阅读Eric Lippert撰写的一篇旧博客文章 ,其中,在写关于关联性时,他提到在C#中, (a + b) + c对于a,b的某些值不等于a + (b + c) , C。

我无法弄清楚哪些类型和范围的算术值可能适用,为什么。




这源于普通值类型(int,long等)使用固定数量的字节存储的事实。 因此,当两个值的总和超过字节存储容量时,溢出是可能的。

在C#中,可以使用BigInteger来避免这种问题。 BigInteger的大小是任意的,因此不会产生溢出。

BigInteger仅适用于.NET 4.0及更高版本(VS 2010+)。




几个类似的例子:

static void A(string s, int i, int j)
{
  var test1 = (s + i) + j;
  var test2 = s + (i + j);
  var testX = s + i + j;
}

这里A("Hello", 3, 5)导致test1testX等于"Hello35" ,而test2将是"Hello8"

和:

static void B(int i, int j, long k)
{
  var test1 = (i + j) + k;
  var test2 = i + (j + k);
  var testX = i + j + k;
}

这里B(2000000000, 2000000000, 42L)导致test1testX在通常的unchecked模式下等于-294967254L ,而test2变为4000000042L




Related