def ieee(f, word=32): """Generate the binary string representing a floating-point value in IEEE754 code.""" f = float(f) if word not in (16, 32, 64, 128): raise ValueError("IEEE754 is defined for 16, 32, 64 and 128 bit words.") exp_bin = range({16:5, 32:8, 64:11, 128:15}[word]) frac_bin = range(word - len(exp_bin) - 1) # Sign. sign_bin = [int(f < 0)] f = abs(f) # Find exponent (adding the bias). bias = 2**(len(exp_bin)-1) -1 exponent = bias while f >= 2: exponent += 1 f /= 2 while f < 1 and exponent > 0: exponent -= 1 f *= 2 if not 0 <= exponent < 2*(bias+1): raise ValueError("Exponent overflow: Absolute exponent must be smaller than %d." % (bias + 1)) # Encode exponent in binary. for i in exp_bin[::-1]: exp_bin[i] = int(exponent % 2) exponent /= 2 # Remove the leading 1 bit. f -= 1 for i in frac_bin: f *= 2 frac_bin[i] = int(f >= 1) f -= frac_bin[i] # Join the binary string components together. return "".join(map(str, sign_bin + exp_bin + frac_bin)) def ieee_decode(binary): """Decode a binary string representing a floating-point value in IEEE754 code.""" # Determine the word size of the binary. word = len(binary) if word not in (16, 32, 64, 128): raise ValueError("IEEE754 is defined for 16, 32, 64 and 128 bit words.") # Determine the length of the exponent. e = {16:5, 32:8, 64:11, 128:15}[word] # Turn the binary string into a bit-list. binary = [int(c) for c in binary] # Split the components. sign = -2 * binary[0] + 1 exp_bin = binary[1:1+e] frac_bin = binary[1+e:] # Decode the exponent. bias = 2**(e-1) - 1 exponent = -bias c = 1 for i in exp_bin[::-1]: exponent += i * c c *= 2 # Decode the fraction. f = float(2**exponent) power = f for i in frac_bin: power *= 0.5 f += i * power return sign * f if __name__ == "__main__": val = ieee(24.) val print val[:16] print val[0], val[1], val[2] val_in_int = int(val[:16], 2) print val_in_int print hex( val_in_int )