作者ching0629 (Syameroke)
看板R_Language
標題[問題] R裡面實際數值與四則運算法?
時間Thu Nov 26 11:37:13 2015
[問題類型]:
[軟體熟悉度]:
開發者(有撰寫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://webptt.com/m.aspx?n=bbs/R_Language/M.1448509036.A.FDB.html
1F:→ celestialgod: rounding error 11/26 11:39
2F:→ celestialgod: sprintf("%.15f", (1-0.9)*100) 11/26 11:40
3F:→ celestialgod: [1] "9.999999999999998" 11/26 11:41
4F:→ ching0629: 謝謝,所以我可以了解一下到底R裡面再算(1-0.9)實際上是 11/26 11:42
5F:→ ching0629: 如何做的?不然我沒有辦法預防這個bug 11/26 11:42
6F:→ celestialgod: as.integer是truncated 11/26 11:44
7F:→ celestialgod: 用round應該會比較好 11/26 11:44
8F:→ ching0629: 舉個例子來說,sprintf("%.200f", (1-0.60)*100)還是能 11/26 11:44
9F:→ ching0629: 整除的樣子 11/26 11:44
10F:→ celestialgod: 0.6在二進位可能是可以完整表示的吧 11/26 11:45
11F:→ ching0629: 謝謝,那我以後在as.integer內都加上round 11/26 11:45
12F:→ celestialgod: 恩,晚點看看wush大大有沒有更好的建議XDD 11/26 11:46
13F:→ ching0629: 那我要提醒大家特別注意了,因為sample函數內有as.inte 11/26 11:47
14F:→ ching0629: ger,所以抽樣前要很確定你放進去的參數是整數 11/26 11:47
15F:→ celestialgod: sample的size本來就只能放integer 會有as.integer 11/26 11:52
16F:→ celestialgod: 不意外xd 11/26 11:52
17F:→ ching0629: 是不會太意外,但這個bug很少出現,測試的時候可能會沒 11/26 11:52
18F:→ ching0629: 意,但實際執行的時候才會出現bug導致程序崩潰 11/26 11:53
19F:→ celestialgod: 恩 是阿QQ as.integer是truncate,也是今天才知道 11/26 11:53
20F:→ celestialgod: 這應該不能說是bug拉QQ 11/26 12:02
21F:推 andrew43: 很可能有用,雖然應該都還沒碰到。 11/27 03:43