7.2 Numbers
7.2.1 Flonums
7.2.2 Fixnums
On this page:
(+  )
(-)
(*)
div
rem
mod
(<)
(<=)
(==)
(!=)
(>=)
(>)
abs
min
max
bits.(<<)
bits.(>>)
bits.logical.(>>)
bits.and
bits.or
bits.xor
bits.not
bits.popcount
bits.popcount16
bits.popcount32
wraparound.(+  )
wraparound.(-)
wraparound.(*)
wraparound.bits.(<<)
from_  flonum
to_  flonum
Array
Array
Array.make
Array.length
Array.get
Array.set
Array.contains
Array.copy
Array.to_  list
Array.to_  sequence
0.45+9.2.0.2

7.2.2 Fixnums🔗ℹ

 import: rhombus/fixnum package: rhombus-lib

A fixnum is an integer that fits into a range that has a specialized representation. This range depends on the architecture’s word size and Racket implementation, but it corresponds to integers that fit into a two’s complement representation using either 30, 31, 61, or 63 bits. In some cases, using functions and operators from rhombus/fixnum can reduce run time, but performance improvements (if any) may require unsafe mode via use_unsafe.

The functions exported by rhombus/fixnum explicitly require fixnum arguments and produce fixnum results.

Some operations, like <, statically specialize for performance when all arguments have static information for the Fixnum annotation. There is no performance difference between that inferred specialization and these operators, and a conversion is inferred only when the result value is the same for unspecialized and fixnum-specific operations.

Two fixnums that are the same according to == are also the same according to ===.

operator

operator ((x :: Fixnum) fixnum.(+) (y :: Fixnum)) :: Fixnum:

  ~order: addition

 

operator

operator ((x :: Fixnum) fixnum.(-) (y :: Fixnum)) :: Fixnum:

  ~order: addition

 

operator

operator (fixnum.(-) (x :: Fixnum)) :: Fixnum:

  ~order: addition

 

operator

operator ((x :: Fixnum) fixnum.(*) (y :: Fixnum)) :: Fixnum:

  ~order: multiplication

 

operator

operator ((x :: Fixnum) fixnum.div (y :: Fixnum)) :: Fixnum:

  ~order: integer_division

 

operator

operator ((x :: Fixnum) fixnum.rem (y :: Fixnum)) :: Fixnum:

  ~order: integer_division

 

operator

operator ((x :: Fixnum) fixnum.mod (y :: Fixnum)) :: Fixnum:

  ~order: integer_division

The same as operators like +, but restricted to fixnum arguments and results. When the result could not be a fixnum, an exception is thrown in safe mode, and the result is unspecified in unsafe mode via use_unsafe.

operator

operator ((x :: Fixnum) fixnum.(<) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

 

operator

operator ((x :: Fixnum) fixnum.(<=) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

 

operator

operator ((x :: Fixnum) fixnum.(==) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

 

operator

operator ((x :: Fixnum) fixnum.(!=) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

 

operator

operator ((x :: Fixnum) fixnum.(>=) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

 

operator

operator ((x :: Fixnum) fixnum.(>) (y :: Fixnum)) :: Boolean:

  ~order: order_comparison

The same as operators like <, but restricted to fixnum arguments. Note that operators like < statically specialize for performance when all arguments have static information associated with the Fixnum annotation.

function

fun fixnum.abs(x :: Fixnum) :: Fixnum

 

function

fun fixnum.min(x :: Fixnum, y :: Fixnum, ...) :: Fixnum

 

function

fun fixnum.max(x :: Fixnum, y :: Fixnum, ...) :: Fixnum

The same as functions like math.abs, but restricted to fixnum arguments and results.

operator

operator ((x :: Fixnum) fixnum.bits.(<<) (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_shift

 

operator

operator ((x :: Fixnum) fixnum.bits.(>>) (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_shift

 

operator

operator ((x :: Fixnum) fixnum.bits.logical.(>>) (y :: Fixnum))

  :: Fixnum:

    ~order: bitwise_shift

 

operator

operator ((x :: Fixnum) fixnum.bits.and (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_conjunction

 

operator

operator ((x :: Fixnum) fixnum.bits.or (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_disjunction

 

operator

operator ((x :: Fixnum) fixnum.bits.xor (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_disjunction

 

operator

operator ((x :: Fixnum) fixnum.bits.not (y :: Fixnum)) :: Fixnum:

  ~order: bitwise_negation

The same as operators like bits.(<<), but restricted to fixnum arguments and results. Like fixnum.(+), when the result would not be a fixnum, an exception is thrown in safe mode.

The fixnum.bits.logical.(>>) operator is like fixnum.bits.(>>), but it fills high bits with 0 instead of the fixnum’s sign bit.

function

fun fixnum.bits.popcount(x :: Fixnum) :: Fixnum

 

function

fun fixnum.bits.popcount16(x :: Fixnum && Int.in(0 ..= 65535))

  :: Fixnum

 

function

fun fixnum.bits.popcount32(x :: Fixnum && Int.in(0 ..= 4294967295))

  :: Fixnum

Returns the number of bits that are set in the fixnum representation of x. Depending on the host system, fixnum.bits.popcount16 and/or fixnum.bits.popcount32 may be faster than fixnum.bits.popcount in cases where the argument is known to fit into 16 bits or 32 bits.

operator

operator ((x :: Fixnum) fixnum.wraparound.(+) (y :: Fixnum))

  :: Fixnum:

    ~order: addition

 

operator

operator ((x :: Fixnum) fixnum.wraparound.(-) (y :: Fixnum))

  :: Fixnum:

    ~order: addition

 

operator

operator (fixnum.wraparound.(-) (x :: Fixnum))

  :: Fixnum:

    ~order: addition

 

operator

operator ((x :: Fixnum) fixnum.wraparound.(*) (y :: Fixnum))

  :: Fixnum:

    ~order: multiplication

 

operator

operator ((x :: Fixnum) fixnum.wraparound.bits.(<<) (y :: Fixnum))

  :: Fixnum:

    ~order: bitwise_shift

Like fixnum.(+), fixnum.(-), fixnum.(*), and fixnum.bits.(<<), but if the result would not fit into a fixnum, high bits are dropped to make it fit (so an exception is never thrown when fixnum arguments are provided).

function

fun fixnum.from_flonum(x :: Flonum) :: Fixnum

 

function

fun fixnum.to_flonum(x :: Fixnum) :: Flonum

Conversions between fixnum and flonum values.

annotation

fixnum.Array

Matches any fixnum array, which is like a normal array, but contains only fixnums. A fixnum array is always mutable, but it does not satisfy Array or MutableArray.

A fixnum array potentially provides better performance than a normal array of fixnums, because the elements are known to be fixnums without a check on access.

Like an array, a fixnum array is indexable using [], assignable via [] and :=, supports membership tests using the in operator, and can be used as sequence. Two fixnum arrays are equal by is_now as long as they have the same length and their elements are pairwise equal by fixnum.(==).

function

fun fixnum.Array(x :: Fxnum, ...) :: fixnum.Array

 

function

fun fixnum.Array.make(len :: Nat, x :: Fixnum = 0) :: fixnum.Array

Like Array and Array.make, but creates a fixnum array.

method

method (arr :: fixnum.Array).length() :: Int

 

method

method (arr :: fixnum.Array).get(n :: Nat) :: Fixnum

 

method

method (arr :: fixnum.Array).set(n :: Nat, x :: Fixnum) :: Void

 

method

method (arr :: fixnum.Array).contains(v :: Any) :: Boolean

 

method

method (arr :: fixnum.Array).copy(

  start :: Nat = 0,

  end :: Nat = arr.length()

) :: fixnum.Array

 

method

method (arr :: fixnum.Array).to_list() :: List.of(Fixnum)

 

method

method (arr :: fixnum.Array).to_sequence()

  :: Sequence.assume_of(Fixnum)

The fixnum.Array.contains method accepts any argument value to find, but it will only succeed for fixnums. The comparsion operation is always fixnum.(==).