-2

I want to convert decimal float numbers in python into twos complement decimal binary numbers. For example 1.5 in twos complement decimal 2.6 (8 bits) would be 0b011000.

Is there a module that can do this for me?

Chet
  • 18,421
  • 15
  • 69
  • 113
  • "decimal binary" suggests that you may not understand what you're doing. What's your input, and what's your desired output? (And are you trying to reimplement the number system?) – user2357112 Jul 10 '13 at 23:51
  • I edited it to provide an example. I thought it was pretty understandable. twos complement: http://en.wikipedia.org/wiki/Two's_complement binary decimal: http://en.wikipedia.org/wiki/Binary_number#Decimal – Chet Jul 15 '13 at 04:15
  • Okay, I think I understand what you want to do, but the terms you're using to describe it don't mean anything like what you think they mean. – user2357112 Jul 15 '13 at 04:20
  • what dont you understand? "twos complement decimal binary numbers" or "decimal float numbers"? – Chet Jul 15 '13 at 04:21
  • Decimal has nothing to do with anything you're talking about. – user2357112 Jul 15 '13 at 04:23

3 Answers3

1

What you're describing has nothing at all to do with decimal. You want to convert a float to a fixed-point binary representation. To do this, you would multiply the float by a scale factor, cast it to an integer, and use Python's built-in string formatting tools to get the string representation:

def float_to_binary(float_):
    # Turns the provided floating-point number into a fixed-point
    # binary representation with 2 bits for the integer component and
    # 6 bits for the fractional component.

    temp = float_ * 2**6  # Scale the number up.
    temp = int(temp)     # Turn it into an integer.
    # If you want -1 to display as 0b11000000, include this part:
    # if temp < 0:
    #     temp += 2**8

    # The 0 means "pad the number with zeros".
    # The 8 means to pad to a width of 8 characters.
    # The b means to use binary.
    return '{:08b}'.format(temp)
user2357112
  • 260,549
  • 28
  • 431
  • 505
0

Well, I couldnt find anything so I wrote some code and tested it.Should work...

def floatToTwosComplementDecimal(intBits,decBits,number):
    if decBits == 0:
        mx = pow(2,intBits-1) - 1 # maximum number
    else:
        mx = pow(2,intBits-1) - pow(2,-1*decBits) # maximum number
    mn = -1*pow(2,intBits-1) # minimum number
    if number > mx:
        print "number:" + str(number) + " has been truncated to: " + str(mx)
        number = mx
    elif number < mn:
        print "number:" + str(number) + " has been truncated to: " + str(mn)
        number = mn
    n = []
    m = 0
    if number < 0:
        n.append(1)
        m = -1*pow(2,intBits-1)
    else:
        n.append(0)
        m = 0
    for i in reversed(range(intBits-1)):
        m1 = m + pow(2,i)
        if number < m1:
            n.append(0)
        else:
            n.append(1)
            m = m1
    for i in range(1,decBits+1):
        m1 = m + pow(2,-1*i)
        if number < m1:
            n.append(0)
        else:
            n.append(1)
            m = m1
    return string.join([str(i) for i in n], '')

def twosComplementDecimalToFloat(intBits,decBits,binString):
    n = 0.0
    if binString[0] == "1":
        n = -1*pow(2,intBits-1)
    for i in range(intBits-1):
        n += int(binString[intBits-1-i])*pow(2,i)
    for i in range(1,decBits+1):
        n += int(binString[intBits-1+i])*pow(2,-1*i)
    return n
Chet
  • 18,421
  • 15
  • 69
  • 113
0

You can use the Binary fractions package. This package implements TwosComplement with binary integers and binary fractions. You can convert binary-fraction strings into their twos complement and vice-versa

Example:

>>> from binary_fractions import TwosComplement
>>> str(TwosComplement(-1.5)) # float --> TwosComplement
'10.1'
>>> str(TwosComplement(1.5)) # float --> TwosComplement
'01.1'
>>> TwosComplement.to_float("11111111111") # TwosComplement --> float
-1.0
>>> TwosComplement.to_float("11111111100") # TwosComplement --> float
-4.0
>>> str(TwosComplement(5)) # int --> TwosComplement
'0101'

To use this with Binary's instead of float's you can use the Binary class inside the same package.

PS: Shameless plug, I'm the author of this package.