Hierarchy of data types

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

This vignette follows terminology outlined by the vctrs package. For further information, see help("faq-compatibility-types", package = "vctrs").

There are three numeric types in base R: logical, integer and double. They form a natural hierarchy from the simplest (logical) to the richest (double), with richer types able to accommodate simpler types without losing information.

The bignum package provides two additional numeric types: biginteger and bigfloat. These are type-compatible with the existing numeric types because they extend the set of possible values. However, the hierarchy becomes more complex because lossy casts are now possible.

knitr::include_graphics("type-hierarchy.png", dpi = 300)

Type conversion and lossy casts

As discussed above, casting values from one type to another can lose information.

We see an example in base R, when we cast a non-integer or large double to an integer:

# non-integer double
as.integer(1.5)

# large double
as.integer(1e10)

For illustrative purposes, we now consider how lossy casts can affect bignum conversions:

library(bignum)

# double -> biginteger
as_biginteger(1.5)

# biginteger -> double
as.double(biginteger(10)^16L)

# bigfloat -> double
as.double(bigfloat(1) / 3)

# bigfloat -> biginteger
as_biginteger(bigfloat(1.5))

# biginteger -> bigfloat
as_bigfloat(biginteger(10)^51L + 1L)


Try the bignum package in your browser

Any scripts or data that you put into this service are public.

bignum documentation built on May 4, 2023, 9:10 a.m.