From 20936c891d03a0d7dd77d30c60bcef29455d98a3 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 28 Oct 2025 12:08:23 -0500 Subject: [PATCH] add tools --- tools/decode_float.py | 12 +++++++ tools/float_table.py | 73 +++++++++++++++++++++++++++++++++++++++++++ tools/pascal.py | 14 +++++++++ 3 files changed, 99 insertions(+) create mode 100644 tools/decode_float.py create mode 100644 tools/float_table.py create mode 100644 tools/pascal.py diff --git a/tools/decode_float.py b/tools/decode_float.py new file mode 100644 index 0000000..7a4e11d --- /dev/null +++ b/tools/decode_float.py @@ -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("> 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)) diff --git a/tools/pascal.py b/tools/pascal.py new file mode 100644 index 0000000..842073f --- /dev/null +++ b/tools/pascal.py @@ -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)