c#编译器如何以不同方式处理加法和乘法

How does c# compiler handle addition and multiplication differently

因为float/double c# 中的数字只有在以 2 为底数的情况下才能精确表示;我希望 t2t3 都非零,但 t2 = 0 而 t3 确实不为零。有人可以解释吗?

double d2 = 1.0/3.0;
double t2 = 1.0 - 3.0*d2;
double t3 = 1.0 - d2 - d2 - d2;

t2 的情况下,您创建了几个确实会导致一定程度错误的中间值。碰巧的是,这些操作会导致相等且相反的误差量,导致这些误差巧合地抵消为 net 误差为零,并产生正确的结果。

t3的情况导致中间操作的每个误差相等而不相反,导致误差相互复合,而不是相互抵消,导致净非零错误。

我认为问题不在于 C# 本身,而在于微处理器的工作方式。您不能除以 1/3 并期望一个数字存储为 1/3。

计算机也做了一些技巧(添加错误)来理解常见的数学:

double d1 = 1/3.0;
d1 = d1 * 3.0;

将导致

 d1 = 1.0