Home Comments Thread
New Thread

4 Comments

earfanfan earfanfan 2021-06-19 07:13:29

.6 - .17 - .43

-5.551115e-17

没明白……

我改成这样:

(.6) - (.17 )- (.43)

以及这样:

(0.6) - (0.17 )- (0.43)

也还是不能得到0。

编程的人(尤其是统计编程的人)千万莫偷懒,写代码之前一定要想好把数学问题转换一下,让计算机能够适应你要用的数字。

容我再想想。

yihui yihui 2021-06-20 03:26:09

(.6) - (.17 )- (.43)(0.6) - (0.17 )- (0.43) 以及 .6 - .17 - .43 这三者没有任何本质区别。有区别的是先加谁先减谁,这是因为计算机受浮点数的表达所限(只有 2 的幂次的数字能精确表达,其它数字都只能是近似表达)。比如 0.17 - 0.6 不能精确等于 -0.43,但 0.17 + 0.43 可以精确得到 0.6。这个其实我也是略知皮毛,要让我写出二进制的表达我也是写不出来的。

编程的人(尤其是统计编程的人)千万莫偷懒,写代码之前一定要想好把数学问题转换一下,让计算机能够适应你要用的数字。

这句话的主要意思是不要拿太小的一串数相乘,否则乘着乘着就变成零了,应该取对数之后相加;同理也不要操作一串大数字,否则很快就变成无穷大了,因为计算机只能计算有限大的数字,超过一定界限之后,计算机就认为那个值是无穷大了。

earfanfan earfanfan 2021-06-20 07:05:29

我以前一直只是用R,dplyr跑得慢就换data.table,都只是用而已。从没想过在计算机的世界里会存在边界,还以为随着科技发展,计算机的边界会一直拓展。

我随便试了试,试到这里:

0.1^300
[1] 1e-300

然后到这里:

0.1^323
[1] 9.881313e-324

又到了这里:

0.1^324
[1] 0

我又想起前面你有一篇日志提到分位数有九种算法,于是?quantile一看确实是有九种。原来在没有经历这么多时间的积累之前的益辉也好厉害啊。

yihui yihui 2021-06-21 00:25:36

我只是知其然不知其所以然,所以也没啥厉害的啦。

有一些高精度计算的工具,比如 Rmpfr,应该是可以避免这些精度损失的问题。

Sign in to join the discussion

Sign in with GitHub