繁体   English   中英

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

[英]How does c# compiler handle addition and multiplication differently

因为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的情况下,您创建了几个确实会导致一定量错误的中间值。 恰好相反,操作导致相等且相反的误差量,导致这些误差同时抵消零误差,并产生正确的结果。

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

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

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

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

会导致

 d1 = 1.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM