2017-09-15 45 views
0

我需要動態地確定給定的十進制數列的差值。給定序列:動態確定十進制數列的差值

my_seq <- seq(0, 10, 0.1) 

其中0.1可以是任何小數(0.01,0.5),但是我使用0.1作爲示例。我試圖確定粒度爲0.1是:

# Generating sequence. 
my_seq <- seq(0, 10, 0.1) 

# Attempting to find difference. 
uni_diff <- unique(diff(my_seq)) 
print(uni_diff) # Will be multiple, due to floating point behavior. 

# Printing out uni_diff for visualization. 
print(sprintf("%.54f", uni_diff)) 

截至年底指出,我的差分失敗,因爲點數字是如何漂浮在電腦處理,請參閱「圈1」在R地獄http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

有沒有可靠的方法來做到這一點?我可以強制用戶告訴我的粒度,這是有效的,但希望能夠從給定的序列自動確定。

編輯:

爲了進一步說明我的問題。假設我給了你:

x = c(0.1, 0.2, 0.3) 

然後問如何確定0.1是每個數字之間的差別。這將如何完成?對整數來說是微不足道的,但看起來不像浮點。

謝謝。

+2

我不明白:你是否試圖找到*完全* 0.1?它不存在。說服自己運行'print(sprintf(「%。54f」,0.1))'。 –

+2

如果您擔心處理小的舍入差異的「好」值,請嘗試'mean(diff(my_seq))' – G5W

+0

我試圖確定「by」來自給定的十進制序列。例如,如果給出(0.1,0.2,0.3)這些分段了多少?浮點問題使這很困難。提前不知道0.1。 – giraffehere

回答

2

0.1沒有精確的表示形式作爲浮點數,所以你不會得到確切的答案。繼@RuiBarradas的評論,你可以打印出高精確度的差異,看到了變化

## print(sprintf("%.32f", diff(my_seq)))   
## This will produce too much output 

table(sprintf("%.32f", diff(my_seq))) 

0.09999999999999964472863211994991 0.09999999999999986677323704498122 
           44         4 
0.09999999999999997779553950749687 0.10000000000000000555111512312578 
           6         2 
0.10000000000000003330669073875470 0.10000000000000008881784197001252 
           1         23 
0.10000000000000053290705182007514 0.10000000000000142108547152020037 
           16         4 

因爲你得到的0.1很多類似的表示,它可能是最好使用mean(diff(my_seq))

sprintf("%.32f", mean(diff(my_seq))) 
[1] "0.10000000000000000555111512312578"