Skip to content

Commit d5b9161

Browse files
committed
hex fix and error support
1 parent 0e0b2ff commit d5b9161

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

ieee754/IEEE754.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def __init__(
5151
self.__bias: int = 2 ** (self.__exponent - 1) - 1
5252
self.__edge_case: str = None
5353
self.number: Decimal = self.validate_number(number)
54+
self.original_number: Decimal = self.number
5455
if self.__edge_case is None:
5556
self.sign: str = self.find_sign()
5657
self.__scale, self.number = self.scale_up_to_integer(self.number, 2)
@@ -60,6 +61,7 @@ def __init__(
6061
)
6162
self.exponent = self.find_exponent()
6263
self.mantissa = self.find_mantissa()
64+
self.converted_number, self.error = self.back_to_decimal_from_bits()
6365

6466
def validate_number(self, number: str) -> Decimal:
6567
if number == "":
@@ -160,6 +162,9 @@ def __str__(self) -> str:
160162
def hex(self) -> str:
161163
h = ""
162164
s = str(self).replace(" ", "")
165+
if len(s) % 4 != 0:
166+
next_multiple = (len(s) // 4 + 1) * 4
167+
s = "0" * (next_multiple - len(s)) + s
163168
limit = len(s) - (len(s) % 4)
164169
for i in range(0, limit, 4):
165170
ss = s[i : i + 4]
@@ -184,11 +189,22 @@ def json(self) -> dict:
184189
"up scaled number": self.number,
185190
"scale": self.__scale,
186191
"number": self.number / (2**self.__scale),
192+
"converted_number": self.converted_number,
193+
"error": self.error,
187194
}
188195

189196
def __repr__(self) -> str:
190197
return self.__str__()
191198

199+
def back_to_decimal_from_bits(self) -> (Decimal, Decimal):
200+
sign, exponent, mantissa = self.__str__().split(" ")
201+
sign = (-1) ** int(sign)
202+
exponent = int(exponent, 2) - self.__bias
203+
mantissa = int(mantissa, 2)
204+
number = Decimal(sign * (1 + mantissa * 2**-self.__mantissa) * 2**exponent)
205+
error = Decimal(self.original_number - number).copy_abs()
206+
return number, error
207+
192208

193209
def half(x: str) -> IEEE754:
194210
"""
@@ -377,3 +393,7 @@ def octuple(x: str) -> IEEE754:
377393
print(f"{a}")
378394
# you can get more details with json
379395
print(a.json())
396+
# you can get the converted number and the error
397+
x = 8.7
398+
a = IEEE754(x, 1)
399+
print(f"{x} is converted as {a.converted_number} ± {a.error}")

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
setup(
77
name="ieee754",
88
packages=["ieee754"],
9-
version="0.6",
9+
version="0.7",
1010
license="MIT",
1111
description="A Python module which converts floating points numbers into IEEE-754 representation.",
1212
long_description=long_description,
1313
long_description_content_type="text/markdown",
1414
author="Bora Canbula",
1515
author_email="bora.canbula@cbu.edu.tr",
1616
url="https://github.com/canbula/ieee754",
17-
download_url="https://github.com/canbula/ieee754/archive/refs/tags/v_06.tar.gz",
17+
download_url="https://github.com/canbula/ieee754/archive/refs/tags/v_07.tar.gz",
1818
keywords=[
1919
"IEEE-754",
2020
"precisions",

0 commit comments

Comments
 (0)