R中x减x不为0

时间:2014-11-08 14:43:39

标签: r fft difference complex-numbers

这是我第一次在这里提问,所以我希望你能理解我的问题。

事情是,我想做自己的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]不是零?

1 个答案:

答案 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。