Quick start¶
If you just want to experiment with the number system tools and test suites, and don’t want to bother cloning and building the source code, there is a Docker container to get started:
> docker pull stillwater/universal
> docker run -it --rm stillwater/universal bash
stillwater@b3e6708fd732:~/universal/build$ ls
CMakeCache.txt Makefile cmake-uninstall.cmake playground universal-config-version.cmake
CMakeFiles applications cmake_install.cmake tests universal-config.cmake
CTestTestfile.cmake c_api education tools universal-targets.cmake
From the build directory, it is convenient to run any of the regression test suites:
stillwater@b3e6708fd732:~/universal/build$ tests/posit/specialized/fast_posit_8_0
Fast specialization posit<8,0> configuration tests
posit< 8,0> useed scale 1 minpos scale -6 maxpos scale 6
Logic operator tests
posit<8,0> == (native) PASS
posit<8,0> != (native) PASS
posit<8,0> < (native) PASS
posit<8,0> <= (native) PASS
posit<8,0> > (native) PASS
posit<8,0> >= (native) PASS
Assignment/conversion tests
posit<8,0> integer assign (native) PASS
posit<8,0> float assign (native) PASS
Arithmetic tests
posit<8,0> add (native) PASS
posit<8,0> += (native) PASS
posit<8,0> subtract (native) PASS
posit<8,0> -= (native) PASS
posit<8,0> multiply (native) PASS
posit<8,0> *= (native) PASS
posit<8,0> divide (native) PASS
posit<8,0> /= (native) PASS
posit<8,0> negate (native) PASS
posit<8,0> reciprocate (native) PASS
Elementary function tests
posit<8,0> sqrt (native) PASS
posit<8,0> exp PASS
posit<8,0> exp2 PASS
posit<8,0> log PASS
posit<8,0> log2 PASS
posit<8,0> log10 PASS
posit<8,0> sin PASS
posit<8,0> cos PASS
posit<8,0> tan PASS
posit<8,0> atan PASS
posit<8,0> asin PASS
posit<8,0> acos PASS
posit<8,0> sinh PASS
posit<8,0> cosh PASS
posit<8,0> tanh PASS
posit<8,0> atanh PASS
posit<8,0> acosh PASS
posit<8,0> asinh PASS
ValidatePower has been truncated
posit<8,0> pow PASS
In /usr/local/bin there are a set of command line utilities to inspect floating point encodings.
stillwater@b3e6708fd732:~/universal/build$ ls /usr/local/bin
compd compf compfp compieee compld complns compp compsi compui float2posit propenv propp
stillwater@b3e6708fd732:~/universal$ compieee 1.2345678901234567890123
compiler : 7.5.0
float precision : 23 bits
double precision : 52 bits
long double precision : 63 bits
Representable? : maybe
Decimal representations
input value: 1.2345678901234567890123
float: 1.23456788
double: 1.2345678901234567
long double: 1.23456789012345678899
Hex representations
input value: 1.2345678901234567890123
float: 1.23456788 hex: 0.7f.1e0652
double: 1.2345678901234567 hex: 0.3ff.3c0ca428c59fb
long double: 1.23456789012345678899 hex: 0.3fff.1e06521462cfdb8d
Binary representations:
float: 1.23456788 bin: 0.01111111.00111100000011001010010
double: 1.2345678901234567 bin: 0.01111111111.00111100000011001010010000101000110001011001 11111011
long double: 1.23456789012345678899 bin: 0.011111111111111.0011110000001100101001000010100011000101 10011111101101110001101
Native triple representations (sign, scale, fraction):
float: 1.23456788 triple: (+,0,00111100000011001010010)
double: 1.2345678901234567 triple: (+,0,00111100000011001010010000101000110001011001111110 11)
long double: 1.23456789012345678899 triple: (+,0,00111100000011001010010000101000110001011001111110 1101110001101)
Scientific triple representation (sign, scale, fraction):
input value: 1.2345678901234567890123
float: 1.23456788 triple: (+,0,00111100000011001010010)
double: 1.2345678901234567 triple: (+,0,00111100000011001010010000101000110001011001111110 11)
long double: 1.23456789012345678899 triple: (+,0,00111100000011001010010000101000110001011001111110 1101110001101)
exact: TBD
Or posit encodings:
stillwater@b3e6708fd732:~/universal/build$ compp 1.2345678901234567890123
posit< 8,0> = s0 r10 e f01000 qNE v1.25
posit< 8,1> = s0 r10 e0 f0100 qNE v1.25
posit< 8,2> = s0 r10 e00 f010 qNE v1.25
posit< 8,3> = s0 r10 e000 f01 qNE v1.25
posit<16,1> = s0 r10 e0 f001111000001 qNE v1.234619140625
posit<16,2> = s0 r10 e00 f00111100000 qNE v1.234375
posit<16,3> = s0 r10 e000 f0011110000 qNE v1.234375
posit<32,1> = s0 r10 e0 f0011110000001100101001000011 qNE v1.2345678918063641
posit<32,2> = s0 r10 e00 f001111000000110010100100001 qNE v1.2345678880810738
posit<32,3> = s0 r10 e000 f00111100000011001010010001 qNE v1.2345678955316544
posit<48,1> = s0 r10 e0 f00111100000011001010010000101000110001011010 qNE v1.2345678901234578
posit<48,2> = s0 r10 e00 f0011110000001100101001000010100011000101101 qNE v1.2345678901234578
posit<48,3> = s0 r10 e000 f001111000000110010100100001010001100010110 qNE v1.2345678901233441
posit<64,1> = s0 r10 e0 f001111000000110010100100001010001100010110011111101100000000 qNE v1.2345678901234567
posit<64,2> = s0 r10 e00 f00111100000011001010010000101000110001011001111110110000000 qNE v1.2345678901234567
posit<64,3> = s0 r10 e000 f0011110000001100101001000010100011000101100111111011000000 qNE v1.2345678901234567
posit<64,4> = s0 r10 e0000 f001111000000110010100100001010001100010110011111101100000 qNE v1.2345678901234567
The following two educational examples are pretty informative when you are just starting out learning about posits: edu_scales and edu_tables.
stillwater@b3e6708fd732:~/universal/build$ education/posit/edu_scales
Experiments with the scale of posit numbers
Posit specificiation examples and their ranges:
Scales are represented as the binary scale of the number: i.e. 2^scale
Small, specialized posit configurations
nbits = 3
posit< 3,0> useed scale 1 minpos scale -1 maxpos scale 1
posit< 3,1> useed scale 2 minpos scale -2 maxpos scale 2
posit< 3,2> useed scale 4 minpos scale -4 maxpos scale 4
posit< 3,3> useed scale 8 minpos scale -8 maxpos scale 8
posit< 3,4> useed scale 16 minpos scale -16 maxpos scale 16
nbits = 4
posit< 4,0> useed scale 1 minpos scale -2 maxpos scale 2
posit< 4,1> useed scale 2 minpos scale -4 maxpos scale 4
posit< 4,2> useed scale 4 minpos scale -8 maxpos scale 8
posit< 4,3> useed scale 8 minpos scale -16 maxpos scale 16
posit< 4,4> useed scale 16 minpos scale -32 maxpos scale 32
nbits = 5
posit< 5,0> useed scale 1 minpos scale -3 maxpos scale 3
posit< 5,1> useed scale 2 minpos scale -6 maxpos scale 6
posit< 5,2> useed scale 4 minpos scale -12 maxpos scale 12
posit< 5,3> useed scale 8 minpos scale -24 maxpos scale 24
posit< 5,4> useed scale 16 minpos scale -48 maxpos scale 48
...
The command edu_tables
generates tables of full posit encodings and their constituent parts:
stillwater@b3e6708fd732:~/universal/build$ education/posit/edu_tables | more
Generate posit configurations
Generate Posit Lookup table for a POSIT<2,0> in TXT format
# Binary Decoded k sign scale regime exponent fraction
value posit_format
0: 00 00 -1 0 0 0 ~ ~
0 2.0x0p
1: 01 01 0 0 0 1 ~ ~
1 2.0x1p
2: 10 10 1 1 0 0 ~ ~
nar 2.0x2p
3: 11 11 0 1 0 1 ~ ~
-1 2.0x3p
Generate Posit Lookup table for a POSIT<3,0> in TXT format
# Binary Decoded k sign scale regime exponent fraction
value posit_format
0: 000 000 -2 0 -1 00 ~ ~
0 3.0x0p
1: 001 001 -1 0 -1 01 ~ ~
0.5 3.0x1p
2: 010 010 0 0 0 10 ~ ~
1 3.0x2p
3: 011 011 1 0 1 11 ~ ~
2 3.0x3p
4: 100 100 2 1 -1 00 ~ ~
nar 3.0x4p
5: 101 111 1 1 1 11 ~ ~
-2 3.0x5p
6: 110 110 0 1 0 10 ~ ~
-1 3.0x6p
7: 111 101 -1 1 -1 01 ~ ~
-0.5 3.0x7p
...