我需要动态确定给定的十进制数序列的差异。鉴于顺序:
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是每个数字之间的差异。怎么做?这对于整数来说是微不足道的,但似乎不是浮点数。
感谢。
答案 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"