2014-11-08 54 views
-1

这是我第一次在这里问一个问题,所以我希望你能理解我的问题。x减x不是0在R

事情是,我想要做我自己的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) 

谁能告诉我,为什么被加数+ exp_factor,谐波[2]是不是零?

回答

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()比较了使用。机$ double.eps^0.5的数值公差两个对象。如果你想要比这更精确的话,你需要仔细考虑错误传播。

欲了解更多信息,请参阅David Goldberg(1991),“每位计算机科学家应该知道的关于浮点运算的知识”,ACM Computing Surveys,23/1,5-48,也可通过http://www.validlab.com/goldberg/paper.pdf获得。

从由Kernighan和Plauger“编程风格的元素”引述如下:

10.0倍0.1是未落1.0。

(报价完)

戈德堡纸是传说中的,你可能想读它。这是所有浮点计算的属性而不是特定于R.

+0

感谢您的回答,认为这应该有很大的帮助。 – 2014-11-09 11:59:15