@@ -51,6 +51,7 @@ def __init__(
51
51
self .__bias : int = 2 ** (self .__exponent - 1 ) - 1
52
52
self .__edge_case : str = None
53
53
self .number : Decimal = self .validate_number (number )
54
+ self .original_number : Decimal = self .number
54
55
if self .__edge_case is None :
55
56
self .sign : str = self .find_sign ()
56
57
self .__scale , self .number = self .scale_up_to_integer (self .number , 2 )
@@ -60,6 +61,7 @@ def __init__(
60
61
)
61
62
self .exponent = self .find_exponent ()
62
63
self .mantissa = self .find_mantissa ()
64
+ self .converted_number , self .error = self .back_to_decimal_from_bits ()
63
65
64
66
def validate_number (self , number : str ) -> Decimal :
65
67
if number == "" :
@@ -160,6 +162,9 @@ def __str__(self) -> str:
160
162
def hex (self ) -> str :
161
163
h = ""
162
164
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
163
168
limit = len (s ) - (len (s ) % 4 )
164
169
for i in range (0 , limit , 4 ):
165
170
ss = s [i : i + 4 ]
@@ -184,11 +189,22 @@ def json(self) -> dict:
184
189
"up scaled number" : self .number ,
185
190
"scale" : self .__scale ,
186
191
"number" : self .number / (2 ** self .__scale ),
192
+ "converted_number" : self .converted_number ,
193
+ "error" : self .error ,
187
194
}
188
195
189
196
def __repr__ (self ) -> str :
190
197
return self .__str__ ()
191
198
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
+
192
208
193
209
def half (x : str ) -> IEEE754 :
194
210
"""
@@ -377,3 +393,7 @@ def octuple(x: str) -> IEEE754:
377
393
print (f"{ a } " )
378
394
# you can get more details with json
379
395
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 } " )
0 commit comments