Skip to content

Commit

Permalink
feat: add number_conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
glencoe committed Sep 1, 2023
1 parent a5aecb3 commit 1fde323
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
36 changes: 36 additions & 0 deletions elasticai/creator/nn/fixed_point/mac/number_conversion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
def _toggle_bits_for_negative_number(number: int, total_bits: int) -> int:
return -(number + int("1" * total_bits, 2))


def _toggle_bits_for_positive_number(number: int, total_bits: int) -> int:
return -_toggle_bits_for_negative_number(-number, total_bits)


def _toggle_bits(number: int, total_bits: int) -> int:
if number < 0:
return _toggle_bits_for_negative_number(number, total_bits)
return _toggle_bits_for_positive_number(number, total_bits)


def bits_to_integer(pattern: str) -> int:
is_negative = pattern[0] == "1"
number = int(pattern, 2)
if is_negative:
number = _toggle_bits(number, len(pattern)) + 1
number = -number
return number


def bits_to_rational(pattern: str, frac_bits: int) -> float:
number = bits_to_integer(pattern)
return number / (1 << frac_bits)


def bits_to_natural(pattern: str) -> int:
return int(pattern, 2)


def integer_to_bits(number: int, total_bits: int) -> str:
if number < 0:
number = -_toggle_bits(number, total_bits) + 1
return f"{number:0{total_bits}b}"
55 changes: 55 additions & 0 deletions elasticai/creator/nn/fixed_point/mac/number_conversion_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from fixed_point.mac.number_conversion import bits_to_rational, integer_to_bits


def test_001_to_0_5():
pattern = "001"
assert 0.5 == bits_to_rational(pattern, frac_bits=1)


def test_001_to_0_25():
pattern = "001"
assert 0.25 == bits_to_rational(pattern, frac_bits=2)


def test_100_to_minus_4():
assert -4 == bits_to_rational("100", frac_bits=0)


def test_100_to_minus_2():
assert -2 == bits_to_rational("100", frac_bits=1)


def test_110_to_minus_1():
pattern = "110"
assert -1 == bits_to_rational(pattern, frac_bits=1)


def test_1_to_minus_1():
pattern = "1"
assert -1 == bits_to_rational(pattern, frac_bits=0)


def test_10_to_minus_2():
pattern = "10"
assert -2 == bits_to_rational(pattern, frac_bits=0)


def test_01_to_1():
pattern = "01"
assert 1 == bits_to_rational(pattern, frac_bits=0)


def test_1_to_01():
assert "01" == integer_to_bits(number=1, total_bits=2)


def test_2_to_10():
assert "10" == integer_to_bits(number=2, total_bits=2)


def test_minus_5_to_1011():
assert "1011" == integer_to_bits(number=-5, total_bits=4)


def test_minus_8_to_1000():
assert "1000" == integer_to_bits(number=-8, total_bits=4)

0 comments on commit 1fde323

Please sign in to comment.