[Rcpp-devel] short, unsigned short, long, unsigned long, long double

Romain Francois romain at r-enthusiasts.com
Tue Apr 6 14:27:34 CEST 2010


Le 06/04/10 14:24, Douglas Bates a écrit :
> On Tue, Apr 6, 2010 at 7:15 AM, Douglas Bates<bates at stat.wisc.edu>  wrote:
>> On Tue, Apr 6, 2010 at 6:54 AM, Romain Francois
>> <romain at r-enthusiasts.com>  wrote:
>>> Hello,
>>>
>>> I have added support for these primitive types in Rcpp, so that one can
>>> wrap containers such as :
>>>
>>> std::vector<short>, ...
>>>
>>> Is this something that should be protected in case there is no "short",
>>> "long", etc ?
>>
>> You can check in R's .Machine object on the various sizes for which R
>> scans.  It can tell you if there is a difference between long and long
>> long or between double and long double.  It does not list anything
>> regarding short.  The sum of double.digits and double.exponent is the
>> number of bits in a double.  Generally log(.Machine$integer.max, 2) is
>> 1 less than the number of bits in an int.
>>
>>
>>> str(.Machine)
>> List of 18
>>   $ double.eps           : num 2.22e-16
>>   $ double.neg.eps       : num 1.11e-16
>>   $ double.xmin          : num 2.23e-308
>>   $ double.xmax          : num 1.80e+308
>>   $ double.base          : int 2
>>   $ double.digits        : int 53
>>   $ double.rounding      : int 5
>>   $ double.guard         : int 0
>>   $ double.ulp.digits    : int -52
>>   $ double.neg.ulp.digits: int -53
>>   $ double.exponent      : int 11
>>   $ double.min.exp       : int -1022
>>   $ double.max.exp       : int 1024
>>   $ integer.max          : int 2147483647
>>   $ sizeof.long          : int 4
>>   $ sizeof.longlong      : int 8
>>   $ sizeof.longdouble    : int 12
>>   $ sizeof.pointer       : int 4
>>> log(.Machine$integer.max, 2)
>> [1] 31
>
> Perhaps I am not answering the question that you asked - that sort of
> thing happens when answering email while still on the first cup of
> coffee.  More helpful might be the comments in the limits include file
> for libstdc++ on Debian/Ubuntu
>
> // The numeric_limits<>  traits document implementation-defined aspects
> // of fundamental arithmetic data types (integers and floating points).
> // From Standard C++ point of view, there are 13 such types:
> //   * integers
> //         bool						        (1)
> //         char, signed char, unsigned char			(3)
> //         short, unsigned short				(2)
> //         int, unsigned					(2)
> //         long, unsigned long					(2)
> //
> //   * floating points
> //         float						(1)
> //         double						(1)
> //         long double						(1)
> //
> // GNU C++ understands (where supported by the host C-library)
> //   * integer
> //         long long, unsigned long long			(2)
> //
> // which brings us to 15 fundamental arithmetic data types in GNU C++.
>
> So it looks like short is part of standard C++ but not long long.

Even better, thanks again.

BTW, I am also a recurrent victim of the "before the first cup of 
coffee" pattern.

Romain


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/9aKDM9 : embed images in Rd documents
|- http://tr.im/OIXN : raster images and RImageJ
|- http://tr.im/OcQe : Rcpp 0.7.7



More information about the Rcpp-devel mailing list