Compare commits
1 Commits
3598eb13f1
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 462536043d |
@@ -1,92 +0,0 @@
|
|||||||
# a wrapper for multiplication script which adds support for floating point numbers
|
|
||||||
|
|
||||||
from lib.prettytable import PrettyTable
|
|
||||||
from multiply import multiply, table_to_text
|
|
||||||
import bitutils as bu
|
|
||||||
|
|
||||||
def get_reference_register_size(*numbers):
|
|
||||||
return max(map(len, numbers))
|
|
||||||
|
|
||||||
def parse_float(number):
|
|
||||||
split_by_dot = number.split('.')
|
|
||||||
#print(number, split_by_dot)
|
|
||||||
Sn = split_by_dot[0] # sign
|
|
||||||
|
|
||||||
split_by_comma = split_by_dot[1].split(',')
|
|
||||||
Pn = len(split_by_comma[0].lstrip('0'))
|
|
||||||
Mn = ''.join(split_by_comma).lstrip('0')
|
|
||||||
#print(Sn, Pn, Mn)
|
|
||||||
return Sn, Pn, Mn
|
|
||||||
|
|
||||||
# compatibility layer for old multiply.py code
|
|
||||||
def to_int(number):
|
|
||||||
return int("0b" + number, 2)
|
|
||||||
|
|
||||||
def normalize_mantice(m, n):
|
|
||||||
M_norm = m.lstrip('0')
|
|
||||||
#print(m, M_norm)
|
|
||||||
P_delta = len(m) - len(M_norm)
|
|
||||||
#print(M_norm[:n], P_delta)
|
|
||||||
return M_norm[:n], P_delta
|
|
||||||
|
|
||||||
def round_mantice(m, n):
|
|
||||||
closest_upper = bu.sum(m[:n+1], '1', n+1)
|
|
||||||
return closest_upper[:n]
|
|
||||||
|
|
||||||
def print_classic_float(label, Sn, Pn, Mn):
|
|
||||||
pt = PrettyTable()
|
|
||||||
pt.field_names = [f"S{label}", f"P{label}", f"M{label}"]
|
|
||||||
pt.add_row([Sn, bin(Pn)[2:], Mn])
|
|
||||||
print(pt)
|
|
||||||
|
|
||||||
def multiply_float(x, y, method, n = 0, verbose = False):
|
|
||||||
Sx, Px, Mx = parse_float(x)
|
|
||||||
Sy, Py, My = parse_float(y)
|
|
||||||
|
|
||||||
print(f"Число X:\n" \
|
|
||||||
f"Знак мантиси: {Sx}\n" \
|
|
||||||
f"Порядок: {Px}\n" \
|
|
||||||
f"Мантиса: {Mx}\n")
|
|
||||||
|
|
||||||
print(f"Число Y:\n" \
|
|
||||||
f"Знак мантиси: {Sy}\n" \
|
|
||||||
f"Порядок: {Py}\n" \
|
|
||||||
f"Мантиса: {My}")
|
|
||||||
|
|
||||||
print("Запис чисел у класичному форматі:")
|
|
||||||
print_classic_float('x', Sx, Px, Mx)
|
|
||||||
print()
|
|
||||||
print_classic_float('y', Sy, Py, My)
|
|
||||||
print()
|
|
||||||
|
|
||||||
reg_size = get_reference_register_size(Mx, My)
|
|
||||||
|
|
||||||
table, result = multiply(n, to_int(bu.al(Mx, n)), to_int(bu.al(My, n)), method)
|
|
||||||
print(f"Процес множення другим методом:\n{table_to_text(table)}\n")
|
|
||||||
|
|
||||||
print("Маємо результат:")
|
|
||||||
|
|
||||||
S_result = bu.xor(Sx, Sy)
|
|
||||||
print(f"Знаковий розряд: {Sx} ^ {Sy} = {S_result}")
|
|
||||||
|
|
||||||
M_norm, P_delta = normalize_mantice(result, n+1)
|
|
||||||
print(f"Нормалізована мантиса: ,{M_norm}")
|
|
||||||
|
|
||||||
P_result = Px + Py - P_delta
|
|
||||||
print(f"Порядок: {Px} + {Py} - {P_delta} = {P_result}")
|
|
||||||
|
|
||||||
M_result = round_mantice(result, n)
|
|
||||||
print(f"Округлюємо мантису до {n} розрядів: ,{M_result}")
|
|
||||||
|
|
||||||
return S_result, P_result, M_result
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
start_x = input("X: ")
|
|
||||||
start_y = input("Y: ")
|
|
||||||
n = int(input("n: "))
|
|
||||||
method = int(input("Method: "))
|
|
||||||
|
|
||||||
S_result, P_result, M_result = multiply_float(start_x, start_y, method, n)
|
|
||||||
|
|
||||||
print(f"Запишемо результат у вигляді таблиці:")
|
|
||||||
print_classic_float('f', S_result, P_result, M_result)
|
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../bitutils.py
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../divide.py
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../lib/
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../multiply.py
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from divide import divide, table_to_text
|
||||||
|
|
||||||
|
print(os.environ, file = sys.stderr)
|
||||||
|
|
||||||
|
raw_params = list(map(lambda x: x.split("="), os.environ['QUERY_STRING'].split("&")))
|
||||||
|
baked_params = {k:v for (k, v) in raw_params}
|
||||||
|
bp = baked_params
|
||||||
|
|
||||||
|
if "x" in bp and "y" in bp and "m" in bp:
|
||||||
|
x = int("0b" + bp['x'], 2)
|
||||||
|
y = int("0b" + bp['y'], 2)
|
||||||
|
m = int(bp['m'])
|
||||||
|
dt, result = divide(max(list(map(len, [bp['x'], bp['y']]))), x, y, m)
|
||||||
|
|
||||||
|
print(f"Content-Type: text/plain; charset=UTF-8\r\n"
|
||||||
|
f"\r\n"
|
||||||
|
f"{table_to_text(dt)}\r\n"
|
||||||
|
f"Result: {result}")
|
||||||
|
else:
|
||||||
|
print("Content-Type: text/plain; charset=UTF-8\r\n\r\nCheck your input!")
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from multiply import multiply, table_to_text
|
||||||
|
|
||||||
|
print(os.environ, file = sys.stderr)
|
||||||
|
|
||||||
|
raw_params = list(map(lambda x: x.split("="), os.environ['QUERY_STRING'].split("&")))
|
||||||
|
baked_params = {k:v for (k, v) in raw_params}
|
||||||
|
bp = baked_params
|
||||||
|
|
||||||
|
if "x" in bp and "y" in bp and "m" in bp:
|
||||||
|
x = int("0b" + bp['x'], 2)
|
||||||
|
y = int("0b" + bp['y'], 2)
|
||||||
|
m = int(bp['m'])
|
||||||
|
dt, result = multiply(max(list(map(len, [bp['x'], bp['y']]))), x, y, m)
|
||||||
|
|
||||||
|
print(f"Content-Type: text/plain; charset=UTF-8\r\n"
|
||||||
|
f"\r\n"
|
||||||
|
f"{table_to_text(dt)}\r\n"
|
||||||
|
f"Result: {result}")
|
||||||
|
else:
|
||||||
|
print("Content-Type: text/plain; charset=UTF-8\r\n\r\nCheck your input!")
|
||||||
Reference in New Issue
Block a user