因为c#中的float / double数只能在base 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;
答案 0 :(得分:4)
在t2
的情况下,您创建了几个确实会导致一些错误的中间值。恰好相反,操作导致相等且相反的错误量,导致这些错误同时抵消 net 错误为零,并创建正确的结果。
t3
的情况导致每个中间操作的错误相等且不相反,导致错误相互混合,而不是相互抵消,导致净非零错误
答案 1 :(得分:0)
我认为问题不在于C#本身,而在于微处理器的工作方式。你不能分为1/3,并期望一个数字存储为1/3。
计算机也会做一些技巧(添加错误)来理解常见数学:
double d1 = 1/3.0;
d1 = d1 * 3.0;
将导致
d1 = 1.0