[英]How does c# compiler handle addition and multiplication differently
因为c#中的浮点数/双数只能在基数2中表示,才能精确表示; 我期望t2
和t3
都是非零但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.