这是我第一次在这里提问,所以我希望你能理解我的问题。
事情是,我想做自己的fft(),而不使用R中给定的一个。 到目前为止,它适用于像seq(1,5)这样的系列。
但对于c(1,1),有些奇怪的事情发生了。据我所知,似乎x - x在这种情况下不是0。 这里是代码行:
series <- c(1,1) # defining the Serie
nr_samples <- length(series) # getting the length
#################
# Calculating the harmonic frequncy
#################
harmonic <- seq(0,(nr_samples-1))
harmonic <- 2*pi*harmonic
harmonic <- harmonic/nr_samples
#################
# Exponential funktion needed for summing up
#################
exponential <- function(index, omega){
result <- exp(-((0+1i)*omega*index))
return(result)
}
#################
# The sum for calculating the fft
#################
my_fft <- function(time_series, omega){
nr_samples <- length(time_series)
summand <- 0
# In the next loop the mistakes Happens
# While running this loop for harmonic[2]
# the rseult should be 0 because
# summand = - exp_factor
# The result for summand + exp_factor
# is 0-1.22464679914735e-16i
for (i in 1:nr_samples){
exp_factor <- exponential((i-1), omega)
summand <- summand + time_series[i]*exp_factor
print(paste("Summand", summand, "Exp", exp_factor))
}
return(summand)
}
transform <- sapply(harmonic, function(x){my_fft(series,x)})
fft_transform <- fft(series)
df <- data.frame(transform, fft_transform)
print(df)
有人能告诉我,为什么summand + exp_factor,对于谐波[2]不是零?
答案 0 :(得分:3)
这通常被称为FAQ 7.31,其中说:
可以用R的数字类型精确表示的唯一数字是整数和分数,其分母是2的幂。其他数字必须四舍五入到(通常)53二进制数字精度。结果,两个浮点数不会可靠地相等,除非它们已经由相同的算法计算,并且即使那时也不总是如此。例如
R> a <- sqrt(2)
R> a * a == 2
[1] FALSE
R> a * a - 2
[1] 4.440892e-16
函数all.equal()使用.Machine $ double.eps ^ 0.5的数字容差来比较两个对象。如果你想要比这更精确,你需要仔细考虑错误传播。
有关详细信息,请参阅例如David Goldberg(1991),“每个计算机科学家应该知道的浮点运算”,ACM计算调查,23 / 1,548,也可以通过http://www.validlab.com/goldberg/paper.pdf获得。
引用Kernighan和Plauger的“编程风格元素”:
10.0倍0.1几乎不是1.0。
(引用结束)
Goldberg论文很有传奇色彩,您可能需要阅读它。这是所有浮点计算的属性,并不特定于R。