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

时间:2015-01-02 21:42:49

标签: c# types

因为c#中的float / double数只能在base 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;

2 个答案:

答案 0 :(得分:4)

t2的情况下,您创建了几个确实会导致一些错误的中间值。恰好相反,操作导致相等且相反的错误量,导致这些错误同时抵消 net 错误为零,并创建正确的结果。

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

答案 1 :(得分:0)

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

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

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

将导致

 d1 = 1.0