From hpages at fredhutch.org  Fri Apr 17 19:04:20 2015
From: hpages at fredhutch.org (=?UTF-8?B?SGVydsOpIFBhZ8Oocw==?=)
Date: Fri, 17 Apr 2015 10:04:20 -0700
Subject: [Rd] behavior of as.integer("5000000000")
In-Reply-To: <21809.3951.814845.844579@stat.math.ethz.ch>
References: <552CA376.7000601@fredhutch.org>	<21804.46194.893705.440976@stat.math.ethz.ch>	<552CB55E.9030306@fredhutch.org>
	<21809.3951.814845.844579@stat.math.ethz.ch>
Message-ID: <55313D14.2050201@fredhutch.org>

Hi Martin,

On 04/17/2015 06:49 AM, Martin Maechler wrote:
>>>>>> Herv? Pag?s <hpages at fredhutch.org>
>>>>>>      on Mon, 13 Apr 2015 23:36:14 -0700 writes:
>
>      > On 04/13/2015 11:32 PM, Martin Maechler wrote:
>      >>
>      >>> Hi,
>      >>> > as.integer("5000000000")
>      >>> [1] 2147483647
>      >>> Warning message:
>      >>> inaccurate integer conversion in coercion
>      >>
>      >>> > as.integer("-5000000000")
>      >>> [1] NA
>      >>> Warning message:
>      >>> inaccurate integer conversion in coercion
>      >>
>      >>> Is this a bug or a feature? The man page suggests it's the
>      >>> latter:
>      >>
>      >> I think you mean the "former", a bug.
>      >>
>      >> and I agree entirely, see the following  " 2 x 2 " comparison :
>      >>
>      >> > N <- 5000000000000 * 8^-(0:7)
>      >> > as.integer(N)
>      >> [1]         NA         NA         NA         NA 1220703125  152587890   19073486    2384185
>      >> Warning message:
>      >> NAs introduced by coercion
>      >> > as.integer(-N)
>      >> [1]          NA          NA          NA          NA -1220703125  -152587890   -19073486
>      >> [8]    -2384185
>      >> Warning message:
>      >> NAs introduced by coercion
>      >> > as.integer(as.character(N))
>      >> [1] 2147483647 2147483647 2147483647 2147483647 1220703125  152587890   19073486    2384185
>      >> Warning message:
>      >> inaccurate integer conversion in coercion
>      >> > as.integer(as.character(-N))
>      >> [1]          NA          NA          NA          NA -1220703125  -152587890   -19073486
>      >> [8]    -2384185
>      >> Warning message:
>      >> inaccurate integer conversion in coercion
>      >>
>      >>
>      >>
>      >>> ?as.integer? attempts to coerce its argument to be of integer
>      >>> type.  The answer will be ?NA? unless the coercion succeeds.
>      >>
>      >>> even though someone could always argue that coercion of "5000000000"
>      >>> succeeded (for some definition of "succeed").
>      >>
>      >>> Also is there any reason why the warning message is different than
>      >>> with:
>      >>
>      >>> > as.integer(-5000000000)
>      >>> [1] NA
>      >>> Warning message:
>      >>> NAs introduced by coercion
>      >>
>      >>> In the case of as.integer("-5000000000"), it's not really that the
>      >>> conversion was "inaccurate", it's a little bit worse than that. And
>      >>> knowing that NAs where introduced by coercion is important.
>      >>
>      >> Yes.
>      >> The message is less a problem than the bug, but I agree we
>      >> should try to improve it.
>
>      > Sounds good. Thanks Martin,
>
> I've committed a change to R-devel now, such that also this case
> returns NA with a warning, actually for the moment with both the
> old warning and the   'NAs introduced by coercion' warning.
> The "nice thing" about the old warning is that it explicitly
> mentions integer coercion.
>
> I currently think we should keep that property, and I'd propose
> to completely drop the
>     "inaccurate integer conversion in coercion"
> warning (it is not used anywhere else currently) and replace it
> in this and other as.integer(.) cases with
>
>    'NAs introduced by integer coercion'
>
> (or something similar. ... improvements / proposals are welcome).

Thanks. That's a much better warning message.

>
> BTW, the fact that as.integer("-5000000000") did produce an NA
> instead of -2147483647 so it would have been compatible with as.integer("5000000000")
> was just another coincidence, namely that we "currently" code NA_integer_
> by INT_MIN (for 32 bit integers, INT_MIN = 2147483648 = 2^31)
> [[but your C code must not rely on that, it is an implementation detail!]]

Yeah, I suspected that.

Thanks for the fix.

H.

>
> Martin
>

-- 
Herv? Pag?s

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fredhutch.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



[Rd] behavior of as.integer("5000000000")
=?UTF-8?B?SGVydsOpIFBhZ8Oocw==?=