[問題] as.integer truncation

看板R_Language作者 (Syameroke)時間8年前 (2015/11/26 11:37), 編輯推噓1(1020)
留言21則, 3人參與, 最新討論串1/1
[問題類型]: [軟體熟悉度]: 開發者(有撰寫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 [關鍵字]: 四則運算; 運算; 整數; 數值 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.40.5 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1448509036.A.FDB.html

11/26 11:39, , 1F
rounding error
11/26 11:39, 1F

11/26 11:40, , 2F
sprintf("%.15f", (1-0.9)*100)
11/26 11:40, 2F

11/26 11:41, , 3F
[1] "9.999999999999998"
11/26 11:41, 3F

11/26 11:42, , 4F
謝謝,所以我可以了解一下到底R裡面再算(1-0.9)實際上是
11/26 11:42, 4F

11/26 11:42, , 5F
如何做的?不然我沒有辦法預防這個bug
11/26 11:42, 5F

11/26 11:44, , 6F
as.integer是truncated
11/26 11:44, 6F

11/26 11:44, , 7F
用round應該會比較好
11/26 11:44, 7F

11/26 11:44, , 8F
舉個例子來說,sprintf("%.200f", (1-0.60)*100)還是能
11/26 11:44, 8F

11/26 11:44, , 9F
整除的樣子
11/26 11:44, 9F

11/26 11:45, , 10F
0.6在二進位可能是可以完整表示的吧
11/26 11:45, 10F

11/26 11:45, , 11F
謝謝,那我以後在as.integer內都加上round
11/26 11:45, 11F

11/26 11:46, , 12F
恩,晚點看看wush大大有沒有更好的建議XDD
11/26 11:46, 12F

11/26 11:47, , 13F
那我要提醒大家特別注意了,因為sample函數內有as.inte
11/26 11:47, 13F

11/26 11:47, , 14F
ger,所以抽樣前要很確定你放進去的參數是整數
11/26 11:47, 14F

11/26 11:52, , 15F
sample的size本來就只能放integer 會有as.integer
11/26 11:52, 15F

11/26 11:52, , 16F
不意外xd
11/26 11:52, 16F

11/26 11:52, , 17F
是不會太意外,但這個bug很少出現,測試的時候可能會沒
11/26 11:52, 17F

11/26 11:53, , 18F
意,但實際執行的時候才會出現bug導致程序崩潰
11/26 11:53, 18F

11/26 11:53, , 19F
恩 是阿QQ as.integer是truncate,也是今天才知道
11/26 11:53, 19F

11/26 12:02, , 20F
這應該不能說是bug拉QQ
11/26 12:02, 20F

11/27 03:43, , 21F
很可能有用,雖然應該都還沒碰到。
11/27 03:43, 21F
文章代碼(AID): #1MLdvi_R (R_Language)