[問題] 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