add tools
This commit is contained in:
parent
9aecbbfc6f
commit
20936c891d
12
tools/decode_float.py
Normal file
12
tools/decode_float.py
Normal file
@ -0,0 +1,12 @@
|
||||
import struct
|
||||
import sys
|
||||
|
||||
with open(sys.argv[1], 'r') as f:
|
||||
buf = f.read()
|
||||
|
||||
nums = [int(i.strip(), 16) for i in buf.split(',') if i.strip()]
|
||||
|
||||
for num in nums:
|
||||
data = struct.pack("<I", num)
|
||||
f, = struct.unpack("<f", data)
|
||||
print(f, 1024 * f)
|
||||
73
tools/float_table.py
Normal file
73
tools/float_table.py
Normal file
@ -0,0 +1,73 @@
|
||||
nums = """
|
||||
0 0.001953125 0.00390625 0.005859375 0.0078125 0.009765625 0.01171875 0.013671875
|
||||
0.015625 0.017578125 0.01953125 0.021484375 0.0234375 0.025390625 0.02734375 0.029296875
|
||||
0.03125 0.03515625 0.0390625 0.04296875 0.046875 0.05078125 0.0546875 0.05859375
|
||||
0.0625 0.0703125 0.078125 0.0859375 0.09375 0.1015625 0.109375 0.1171875
|
||||
0.125 0.140625 0.15625 0.171875 0.1875 0.203125 0.21875 0.234375
|
||||
0.25 0.28125 0.3125 0.34375 0.375 0.40625 0.4375 0.46875
|
||||
0.5 0.5625 0.625 0.6875 0.75 0.8125 0.875 0.9375
|
||||
1 1.125 1.25 1.375 1.5 1.625 1.75 1.875
|
||||
2 2.25 2.5 2.75 3 3.25 3.5 3.75
|
||||
4 4.5 5 5.5 6 6.5 7 7.5
|
||||
8 9 10 11 12 13 14 15
|
||||
16 18 20 22 24 26 28 30
|
||||
32 36 40 44 48 52 56 60
|
||||
64 72 80 88 96 104 112 120
|
||||
128 144 160 176 192 208 224 240
|
||||
"""
|
||||
|
||||
nums = [float(i) for i in nums.split()]
|
||||
|
||||
def parse_043_float(i):
|
||||
get_significand = lambda i: (i >> 0) & 0b111
|
||||
get_exponent = lambda i: (i >> 3) & 0b1111
|
||||
# ieee_754_bias = 2 ** (4 - 1) - 1
|
||||
bias = 7
|
||||
|
||||
exponent = get_exponent(i)
|
||||
significand = get_significand(i)
|
||||
|
||||
base = 8
|
||||
if exponent > 0:
|
||||
significand |= 0b1000
|
||||
else:
|
||||
# denormal
|
||||
if significand == 0:
|
||||
significand = 0b0001
|
||||
base = 16
|
||||
exponent = 1
|
||||
|
||||
value = (significand / base) * 2 ** (exponent - bias)
|
||||
return value
|
||||
|
||||
for i, num in enumerate(nums):
|
||||
if num == 0:
|
||||
continue
|
||||
assert num == parse_043_float(i)
|
||||
|
||||
assert max(range(128)) == 127
|
||||
assert min(range(128)) == 0
|
||||
|
||||
def find_nearest(n):
|
||||
value = parse_043_float(0)
|
||||
nearest = 0
|
||||
nearest_diff = abs(value - n)
|
||||
|
||||
for i in range(1, 128):
|
||||
value = parse_043_float(i)
|
||||
diff = abs(value - n)
|
||||
if diff < nearest_diff:
|
||||
nearest = i
|
||||
nearest_diff = diff
|
||||
|
||||
return nearest, parse_043_float(nearest)
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
number = sys.argv[1]
|
||||
if '.' in number:
|
||||
number = float(number)
|
||||
print("nearest", number, *find_nearest(number))
|
||||
else:
|
||||
number = int(number, 10)
|
||||
print(parse_043_float(number))
|
||||
14
tools/pascal.py
Normal file
14
tools/pascal.py
Normal file
@ -0,0 +1,14 @@
|
||||
def tri(parents, depth):
|
||||
if depth == 20:
|
||||
return
|
||||
|
||||
new = [1] * (len(parents) + 1)
|
||||
for i in range(1, len(parents)):
|
||||
new[i] = parents[i] + parents[i - 1]
|
||||
if len(new) % 2 == 1:
|
||||
div = sum(new)
|
||||
print(list(reversed([new[i] / div for i in range(len(new) // 2 + 1)])))
|
||||
tri(new, depth + 1)
|
||||
|
||||
parents = [1, 2, 1]
|
||||
tri(parents, 2)
|
||||
Loading…
x
Reference in New Issue
Block a user