[英]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.