Source code for elasticai.creator.nn.fixed_point.number_conversion

"""
Here we collect several functions to convert fixed point,
integer and natural numbers to bit patterns and vice versa.

IMPORTANT: We assume, the numbers to be representable in
the target format!
"""


def _toggle_bits(number: int, total_bits: int) -> int:
    def invert(value: int) -> int:
        return value ^ int("1" * total_bits, 2)

    def discard_leading_bits(value: int) -> int:
        return value & int("1" * total_bits, 2)

    return discard_leading_bits(invert(abs(number)))


def _twos_complement(number, total_bits):
    return _toggle_bits(number, total_bits) + 1


[docs] def bits_to_integer(pattern: str) -> int: is_negative = pattern[0] == "1" number = int(pattern, 2) if is_negative: number = -_twos_complement(number, len(pattern)) return number
[docs] def bits_to_rational(pattern: str, frac_bits: int) -> float: pattern = pattern.strip() number = bits_to_integer(pattern) return number / (1 << frac_bits)
[docs] def convert_rational_to_bit_pattern( rational: float, total_bits: int, frac_bits: int ) -> str: return integer_to_bits(int(rational * (1 << frac_bits)), total_bits=total_bits)
[docs] def bits_to_natural(pattern: str) -> int: return int(pattern, 2)
[docs] def integer_to_bits(number: int, total_bits: int) -> str: if number < 0: number = _twos_complement(number, total_bits) return f"{number:0{total_bits}b}"
def _max_twos_complement_pattern(total_bits): return "0" + "1" * (total_bits - 1) def _min_twos_complement_pattern(total_bits): return "1" + "0" * (total_bits - 1)
[docs] def max_rational(total_bits: int, frac_bits: int) -> float: return bits_to_rational( _max_twos_complement_pattern(total_bits), frac_bits=frac_bits )
[docs] def min_rational(total_bits: int, frac_bits: int) -> float: return bits_to_rational( _min_twos_complement_pattern(total_bits), frac_bits=frac_bits )
[docs] def min_integer(total_bits: int) -> int: return bits_to_integer(_min_twos_complement_pattern(total_bits))
[docs] def max_integer(total_bits: int) -> int: return bits_to_integer(_max_twos_complement_pattern(total_bits))
[docs] def min_natural(total_bits: int) -> int: return 0
[docs] def max_natural(total_bits: int) -> int: return bits_to_natural("1" * total_bits)