[问题] as.integer truncation

楼主: ching0629 (Syameroke)   2015-11-26 11:37:13
[问题类型]:
[软件熟悉度]:
开发者(有撰写R 的套件经验)
[问题叙述]:
这个问题很奇怪,我是在使用sample函数时发现的。
简单来说是R在numeric以及integer的转换上面似乎不是这么简单。
我把问题简单呈现如下面的程式码,而这个bug似乎不常出现(但也非罕见),有时候会出错有时候又不会
[程式范例]:
> (1-0.9)*100
[1] 10
> as.integer((1-0.9)*100)
[1] 9
> as.integer((1-0.8)*100)
[1] 19
> as.integer((1-0.7)*100)
[1] 30
[环境叙述]:
R 3.2.2
[关键字]:
四则运算; 运算; 整数; 数值
作者: celestialgod (天)   2015-11-26 11:39:00
rounding errorsprintf("%.15f", (1-0.9)*100)[1] "9.999999999999998"
楼主: ching0629 (Syameroke)   2015-11-26 11:42:00
谢谢,所以我可以了解一下到底R里面再算(1-0.9)实际上是如何做的?不然我没有办法预防这个bug
作者: celestialgod (天)   2015-11-26 11:44:00
as.integer是truncated用round应该会比较好
楼主: ching0629 (Syameroke)   2015-11-26 11:44:00
举个例子来说,sprintf("%.200f", (1-0.60)*100)还是能整除的样子
作者: celestialgod (天)   2015-11-26 11:45:00
0.6在二进制可能是可以完整表示的吧
楼主: ching0629 (Syameroke)   2015-11-26 11:45:00
谢谢,那我以后在as.integer内都加上round
作者: celestialgod (天)   2015-11-26 11:46:00
恩,晚点看看wush大大有没有更好的建议XDD
楼主: ching0629 (Syameroke)   2015-11-26 11:47:00
那我要提醒大家特别注意了,因为sample函数内有as.integer,所以抽样前要很确定你放进去的参数是整数
作者: celestialgod (天)   2015-11-26 11:52:00
sample的size本来就只能放integer 会有as.integer不意外xd
楼主: ching0629 (Syameroke)   2015-11-26 11:52:00
是不会太意外,但这个bug很少出现,测试的时候可能会没意,但实际执行的时候才会出现bug导致程序崩溃
作者: celestialgod (天)   2015-11-26 11:53:00
恩 是阿QQ as.integer是truncate,也是今天才知道这应该不能说是bug拉QQ
作者: andrew43 (讨厌有好心推文后删文者)   2015-11-27 03:43:00
很可能有用,虽然应该都还没碰到。

Links booklink

Contact Us: admin [ a t ] ucptt.com