softposit-rkt
1 Introduction
This package is a set of racket bindings for the SoftPosit library. More information on posits can be found on Posithub. Posits are an alternative to floating point numbers designed to improve performance and accuracy.
2 API
(require softposit-rkt) | package: softposit-rkt |
2.1 Posits
Posits themselves are a representation of the projective reals. The different sizes of posits are included this package are _posit8 _posit16 _posit32 _posit64 and _posit128. Note thought that only the 8, 16, and 32 bit posits currently have arithmetic operators implemented.
The posit types in this package are bindings for c types. Note that only the types and type predicates are bound. All other operations with posits should be accessed with the other provided functions.
2.2 Posit Types
value
_posit8 : ctype?
value
_posit16 : ctype?
value
_posit32 : ctype?
value
_posit64 : ctype?
value
_posit128 : ctype?
2.3 Creating Posits
procedure
(uint32->posit8 n) → posit8?
n : natural?
procedure
(uint32->posit16 n) → posit16?
n : natural?
procedure
(uint32->posit32 n) → posit32?
n : natural?
procedure
(uint64->posit8 n) → posit8?
n : natural?
procedure
(uint64->posit16 n) → posit16?
n : natural?
procedure
(uint64->posit32 n) → posit32?
n : natural?
procedure
(int32->posit8 n) → posit8?
n : integer?
procedure
(int32->posit16 n) → posit16?
n : integer?
procedure
(int32->posit32 n) → posit32?
n : integer?
procedure
(int64->posit8 n) → posit8?
n : integer?
procedure
(int64->posit16 n) → posit16?
n : integer?
procedure
(int64->posit32 n) → posit32?
n : integer?
procedure
(double->posit8 n) → posit8?
n : real?
procedure
(double->posit16 n) → posit16?
n : real?
procedure
(double->posit32 n) → posit32?
n : real?
2.4 Converting Between Posit Types
procedure
(posit8->posit16 p) → posit16?
p : posit8?
procedure
(posit8->posit32 p) → posit32?
p : posit8?
procedure
(posit16->posit8 p) → posit8?
p : posit16?
procedure
(posit16->posit32 p) → posit32?
p : posit16?
procedure
(posit32->posit8 p) → posit8?
p : posit32?
procedure
(posit32->posit16 p) → posit16?
p : posit32?
2.5 Converting Back from Posits
Note that there are multiple bindings exposed which cast back to natural numbers and to integers (e.g. posit16->uint32 and posit16->uint64). Although these will cast back to the same racket type, they are different functions in the underlying C code, so be careful to avoid unexpected behavior when hitting the maximum value for uint32s. It is recommended to always cast to a double to avoid losing decimal accuracy.
procedure
(posit8->uint32 p) → natural?
p : posit8?
procedure
(posit16->uint32 p) → natural?
p : posit16?
procedure
(posit32->uint32 p) → natural?
p : posit32?
procedure
(posit8->uint64 p) → natural?
p : posit8?
procedure
(posit16->uint64 p) → natural?
p : posit16?
procedure
(posit32->uint64 p) → natural?
p : posit32?
procedure
(posit8->int32 p) → integer?
p : posit8?
procedure
(posit16->int32 p) → integer?
p : posit16?
procedure
(posit32->int32 p) → integer?
p : posit32?
procedure
(posit8->int64 p) → integer?
p : posit8?
procedure
(posit16->int64 p) → integer?
p : posit16?
procedure
(posit32->int64 p) → integer?
p : posit32?
procedure
(posit8->double p) → real?
p : posit8?
procedure
(posit16->double p) → real?
p : posit16?
procedure
(posit32->double p) → real?
p : posit32?
2.6 Posit Operations
procedure
(posit8-round-to-int p) → posit8?
p : posit8?
procedure
(posit8-add p1 p2) → posit8?
p1 : posit8? p2 : posit8?
procedure
(posit8-sub p1 p2) → posit8?
p1 : posit8? p2 : posit8?
procedure
(posit8-mul p1 p2) → posit8?
p1 : posit8? p2 : posit8?
procedure
(posit8-div p1 p2) → posit8?
p1 : posit8? p2 : posit8?
procedure
(posit8-sqrt p1) → posit8?
p1 : posit8?
procedure
(posit8-neg p1) → posit8?
p1 : posit8?
procedure
(posit16-neg p1) → posit16?
p1 : posit16?
procedure
(posit32-neg p1) → posit32?
p1 : posit32?
procedure
(posit16-round-to-int p) → posit16?
p : posit16?
procedure
(posit16-add p1 p2) → posit16?
p1 : posit16? p2 : posit16?
procedure
(posit16-sub p1 p2) → posit16?
p1 : posit16? p2 : posit16?
procedure
(posit16-mul p1 p2) → posit16?
p1 : posit16? p2 : posit16?
procedure
(posit16-div p1 p2) → posit16?
p1 : posit16? p2 : posit16?
procedure
(posit16-sqrt p1) → posit16?
p1 : posit16?
procedure
(posit32-round-to-int p) → posit32?
p : posit32?
procedure
(posit32-add p1 p2) → posit32?
p1 : posit32? p2 : posit32?
procedure
(posit32-sub p1 p2) → posit32?
p1 : posit32? p2 : posit32?
procedure
(posit32-mul p1 p2) → posit32?
p1 : posit32? p2 : posit32?
procedure
(posit32-div p1 p2) → posit32?
p1 : posit32? p2 : posit32?
procedure
(posit32-sqrt p1) → posit32?
p1 : posit32?
2.7 Quires
Quires are another feature of the Posit specication. They can be thought of as a large accumulator designed to hold enough bits of information so as to not introduce any rounding error. Note that these accumulators have a fixed number of bits, so only a limited (but very large) number of accumulations can be done on them safely. A _quire8 has 4 times the number of bits as a _posit8, a _quire16 has 8 times the bits as a _posit16, and a _quire32 has 16 times the bits as a _posit32.
2.8 Quire Types
value
_quire8 : ctype?
value
_quire16 : ctype?
value
_quire32 : ctype?
2.9 Creating Quires
All quires are initialized to 0.
procedure
(create-quire8) → quire8?
procedure
procedure
procedure
(posit8->quire8 p) → quire8?
p : posit8?
procedure
(posit16->quire16 p) → quire16?
p : posit16?
procedure
(posit32->quire32 p) → quire32?
p : posit32?
2.10 Quire Operations
Note that there is currently no twos-complement for _quire8s.
procedure
(quire8-fdp-add q p1 p2) → quire8?
q : quire8? p1 : posit8? p2 : posit8?
procedure
(quire8-fdp-sub q p1 p2) → quire8?
q : quire8? p1 : posit8? p2 : posit8?
procedure
(quire16-fdp-add q p1 p2) → quire16?
q : quire16? p1 : posit16? p2 : posit16?
procedure
(quire16-fdp-sub q p1 p2) → quire16?
q : quire16? p1 : posit16? p2 : posit16?
procedure
q : quire16?
procedure
(quire32-fdp-add q p1 p2) → quire32?
q : quire32? p1 : posit32? p2 : posit32?
procedure
(quire32-fdp-sub q p1 p2) → quire32?
q : quire32? p1 : posit32? p2 : posit32?
procedure
q : quire32?
2.11 Retrieving Values from Quires
procedure
(quire8->posit8 q) → posit8?
q : quire8?
procedure
(quire16->posit16 q) → posit16?
q : quire16?
procedure
(quire32->posit32 q) → posit32?
q : quire32?
procedure
(quire8->double q) → real?
q : quire8?
procedure
(quire16->double q) → real?
q : quire16?
procedure
(quire32->double q) → real?
q : quire32?
2.12 Generating Random Posits and Quires
Also included is functionality to generate random posits and quires.
procedure
(random-posit8) → posit8?
procedure
procedure
procedure
procedure
procedure
(random-quire8) → quire8?
procedure
procedure
2.13 Posit Constants
procedure
(posit8-nar) → posit8?
procedure
(posit16-nar) → posit16?
procedure
(posit32-nar) → posit32?
procedure
(posit64-nar) → posit64?
procedure
2.14 Posit Ordinal Functions
These functions convert to and from the ordinal representation of a posit. NaR returns 0.
procedure
p : posit8?
procedure
p : posit16?
procedure
p : posit32?
procedure
(ordinal->p8>ordinal n) → posit8?
n : natural?
procedure
(ordinal->p16>ordinal n) → posit16?
n : natural?
procedure
(ordinal->p32>ordinal n) → posit32?
n : natural?