为什么c#不能计算数学函数的精确值

Tim*_*sen 9 c# rounding

为什么c#不能做任何确切的操作.

Math.Pow(Math.Sqrt(2.0),2) == 2.0000000000000004
Run Code Online (Sandbox Code Playgroud)

我知道双打是如何工作的,我知道舍入误差来自哪里,我知道它几乎是正确的值,而且我知道你不能在有限的双精度中存储无限数.但是为什么没有一种方法可以让c#完全计算出来,而我的计算器可以做到.

编辑

这不是我的计算器,我只是举个例子:

http://www.wolframalpha.com/input/?i=Sqrt%282.000000000000000000000000000000000000000000000000000000000000000000000000000000001%29%5E2

干杯

Jon*_*eet 8

机会是你的计算器不能完全做到 - 但它可能存储的信息比它显示的更多,所以平方后的错误最终会超出显示的范围.要么是这种情况,要么在这种情况下它的错误会被取消 - 但这与以正当的方式完全正确地解决它并不相同.

另一种选择是计算器记住导致先前结果的操作,并应用代数来取消操作......但这似乎不太可能..NET 肯定不会尝试这样做 - 它将计算中间值(两个根),然后将其平方.

如果您认为自己可以做得更好,我建议您尝试将两个平方根写入(比方说)50个小数位,然后将其完全平方.看看你是否正好2 ...

  • 因为浮点运算是快速而简单的,并且对于大多数应用来说它足够好.是的,Mathematica可以做到这一点,是的,它很快.但它带来了复杂性增加的代价.并且由于每个程序员都知道(或应该知道)这不是问题:如果需要这种类型的准确性,那么可以使用这些工具. (2认同)