Skip to content

numerical issue in contour.default?

4 messages · Duncan Murdoch, Brian Ripley, Thomas Petzoldt

#
Dear R developers,

I found a small issue while plotting contours of data containing both
"usual" and "very small" numbers. It appeared with both R 3.0.1 and
R-Devel on Windows, and I could reproduce it on Linux. Would it be
possible to solve this before the upcoming release?

Thanks a lot for developing this great software!

Thomas


Example:
########


set.seed(357)
z1 <- matrix(runif(100, -1e-180, 1e-180), nrow = 10)
contour(z1)    # ok

z2 <- matrix(c(runif(50, -1, 1), runif(50, -1e-180, 1e-180)), nrow = 10)
contour(z2)   # Error in contour.default(z) : k != 2 or 4

contour(z2 * 1e20)        # 20 worked, 19 produced error
contour(round(z2, 179))   # rounding to 179 digits works but not 180
R Under development (unstable) (2013-09-11 r63910)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
#
On 13/09/2013 10:01 AM, Thomas Petzoldt wrote:
I don't see the error in 32 bits, but I do see it in 64 bits.  I think 
it's really unlikely this will be fixed before 3.0.2, unless you send a 
well tested patch in the next few days.  Code freeze is on Wednesday.

Duncan Murdoch
#
On 13/09/2013 15:14, Duncan Murdoch wrote:
And not even then: we would not have time to do sufficiently extensive 
checking.

Reporting to bugs.r-project.org with a patch would get the process rolling.

  
    
#
On 13.09.2013 16:44, Prof Brian Ripley wrote:
You are right, I can reproduce it only on 64 bit.
Agreed, so I'll put a workaround in my package for now.
O.K., I will report it. After a look in the sources I would guess that 
it may be in:

src/main/contour-common.h

static int ctr_intersect(double z0, double z1, double zc, double *f)
{
     if ((z0 - zc) * (z1 - zc) < 0.0) {
	*f = (zc - z0) / (z1 -	z0);
	return 1;
     }
     return 0;
}


... but you are right, too many things depend on it.

Many thanks for the immediate feedback!

Thomas