-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate_posit.py
executable file
·91 lines (71 loc) · 2.25 KB
/
create_posit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python
import sys
import math
ES=3
def usage():
print("usage: create_posit.py seed exponent fraction")
def create_seed_seq(seed):
is_positive = int(seed > 0)
positive_seed = abs(seed)
seed_sequence = ""
for i in range(positive_seed):
seed_sequence = "{}".format(is_positive) + seed_sequence
seed_sequence = seed_sequence + "{}".format(int(not(is_positive)))
if (seed > 0):
seed_sequence = "1" + seed_sequence
return seed_sequence
def create_exp_seq(exp):
return "{0:03b}".format(exp)
def create_frac_seq(frac):
frac = frac - 1
divider = 0.5
frac_seq = ""
for i in range(16):
tmp_frac = frac - divider
if (tmp_frac >= 0):
frac_seq = frac_seq + "1"
frac = tmp_frac
else:
frac_seq = frac_seq + "0"
divider = divider / 2
return frac_seq
# if (len(sys.argv) < 3):
# usage()
# exit(1)
# seed = sys.argv[1]
# exponent = sys.argv[2]
# fraction = sys.argv[3]
def twos_comp(val, bits):
"""compute the 2's complement of int value val"""
val = (1 << bits) - val # compute 2's complement
# val = val & ( (1 << bits) - 1 ) # mask value to be of length 'bits'
return val
def create_vector(seed, exponent, fraction):
# seed = 4
# exponent = 2
# fraction = -1.75
absolute_fraction = abs(fraction)
if (exponent > 2**ES or exponent < 0):
print("Exponent should be between 0 and {}".format(2**ES))
exit(1)
if (absolute_fraction >= 2 or absolute_fraction < 1):
print("Fraction should be between 1 and 2")
exit(1)
seed_seq = create_seed_seq(seed)
exp_seq = create_exp_seq(exponent)
fraction_seq = create_frac_seq(absolute_fraction)
posit = "0" + seed_seq + exp_seq + fraction_seq
posit = posit[0:16]
if (fraction < 0):
posit = "{0:016b}".format(twos_comp(int(posit, 2), 16))
return posit
seed = -5
exp = 3
frac = -(1 + 1/4 + 1/16)
posit = create_vector(seed, exp, frac)
print(posit)
# print("{0:016b}".format(twos_comp(int(posit, 2), 16)))
# neg_posit = "{0:016b}".format(twos_comp(int(posit, 2), 16))
# pos_posit = "{0:016b}".format(twos_comp(int(neg_posit, 2), 16))
# print(neg_posit)
# print(pos_posit[0:16])