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
8.16.0.4
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 complete 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.

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 raised 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.