Skip to content
Prev 33456 / 63424 Next

Inaccurate complex arithmetic of R (Matlab is accurate)

Dear Martin,

I definitely do not agree with this. Consider your own proposal of
writing the Rosenbrock function:

    rosen2 <- function(x) {
        n <- length(x)
        x1 <- x[2:n]
        x2 <- x[1:(n-1)]
        sum(100*(x1-x2*x2)*(x1-x2*x2) + (1-x2)*(1-x2))
    }

The complex-step derivative approximation suggests to set h <- 1.0e-20
and then to compute the expression  Im(rosen(x+hi))/h , so let's do it:

    h  <- 1.0e-20
    xh <- c(0.0094 + h*1i, 0.7146, 0.2179, 0.6883, 0.5757,
            0.9549,        0.7136, 0.0849, 0.4147, 0.4540)

    Im(rosen2(xh)) / h
    # [1] -4.6677637664000

which is exactly the correct derivative in the first variable, namely
d/dx1 rosen(x). To verify, you could even calculate this by hand on a
"Bierdeckel".

Now look at the former definition, say rosen1(), using '^' instead:

    rosen1 <- function(x) {
        n <- length(x)
        x1 <- x[2:n]
        x2 <- x[1:(n-1)]
        sum(100*(x1-x2^2)^2 + (1-x2)^2)
    }

    Im(rosen1(xh)) / h
    # [1] -747143.8793904837

We find that R is "running wild". And this has nothing to do with IEEE
arithmetics or machine accuracy, as we can see from the first example
where R is able to do it right.

And as I said, the second example is working correctly in free software
such as Octave which I guess does not do any "clever" calculations here.

We do _not_ ask for multiple precision arithmetics here !

Regards
Hans Werner


Martin Becker <martin.becker <at> mx.uni-saarland.de> writes: