动态确定十进制序列的差异

时间:2017-09-15 20:23:34

标签: r floating-point sequence

我需要动态确定给定的十进制数序列的差异。鉴于顺序:

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))

如最后所述,由于计算机中浮点数的处理方式,我的区分失败,请参阅R Inferno中的“Circle 1”http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

有没有可靠的方法来做到这一点?我可以强制用户告诉我粒度,这是有效的,但希望能够自动从给定的序列中确定。

编辑:

进一步说明我的问题。让我们说我给了你:

x = c(0.1, 0.2, 0.3)

然后询问如何确定0.1是每个数字之间的差异。怎么做?这对于整数来说是微不足道的,但似乎不是浮点数。

感谢。

1 个答案:

答案 0 :(得分: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"