【发布时间】:2016-11-04 13:26:43
【问题描述】:
今天我发现一个有趣的事实,即公式会影响结果的精度。请看下面的代码
double x = 7d
double y = 10d
println(1-x/y)
println((y-x)/y)
这段代码我是用groovy写的,你可以把它当成Java
结果是
1-x/y: 0.30000000000000004
(y-x)/y: 0.3
有趣的是,两个应该相等的公式有不同的结果。
- 谁能帮我解释一下?
- 我可以将第二个公式应用到任何适用的地方,作为双精度问题的有效解决方案吗?
【问题讨论】:
-
尝试打印出所有的中间结果。其中一个可能略有偏差,因为它无法以 base-2 准确表示。
-
一点也不奇怪:一个极端的例子是
1-sqr(cos(x)),其中 sqr 表示平方。这在数学上等于sqr(sin(x))。现在尝试将这些公式评估为接近 0 的x。