long/bigint/decimal equivalent datatype in R
Note that on almost all implementations of R the range of
representable integers is restricted to about +/-2*10^9: ‘double’s
can hold much larger integers exactly.
so I would recommend using
numeric (i.e. 'double') -- a double-precision number.
Updated in 2022: This issue still stands and will unlikely ever change:
integer in R is (signed)
int32_t (and hence range limited).
double in a proper double. Package
int64 aimed to overcome this by using S4 and a
complex (integer) type to give us 64 bit resolution (as in
bit64 does the same by using a
double internally and many packages from
data.table to database interfaces or JSON parsers (including our
RcppSimdJson) use it. Our package
nanotime relies on it to provide
int64_t based timestamps (i.e nanoseconds since epoch). In short there is not other way. Some JSON packages stick with string representation too ("expensive", need to convert later).
Conversion of long values into double in R
I'd suggest using quote=FALSE in the
> print(as.character(x), quote=FALSE)
> print(x, digits=20)
> print(as.character(x) )
There is no R long-integer mode. You should understand that numbers with more than 9 base-10 digits are being "stored as decimals", i.e. stored with abscissa+mantissa, but the apparent increase of integer length is accomplished through printing of the exact conversion of the abscissa of the "double" to base-10 representation without the decimal point. Notice what happens if you explicitly attempt to "store as integer":
> x <- 1426643216897L
non-integer value 1426643216897L qualified with L; using numeric value
If you needed to store a number with greater length than the 53 binary digits could handle, you would need to go with character storage, and then use the quote=FALSE option or use
cat for output:
Are the as.character() and paste() limited by the size of the numeric vales they are given?
Remember that numbers are stored in a fixed number of bytes based upon the hardware you are running on. Can you show that your very big integer is treated properly by normal arithmetic operations? If not, you're probably trying to store a number to large to store in your R install's integer # of bytes. The number you see is just what could fit.
You could try storing the number as a double which is technically less precise but can store larger numbers in scientific notation.
Consider the answers in long/bigint/decimal equivalent datatype in R which list solutions including arbitrary precision packages.