Source code for hal.maths.la.numerical_base

#!/usr/bin/env python
# coding: utf-8

from collections import namedtuple

from hal.lists.utils import lst2str
from hal.maths.combo.utils import get_superset

MachineNumber = namedtuple('MachineNumber', ['sign', 'mantissa', 'exponent'])


# Returns a list of strings. Each one of them is a mantissa.
[docs]def get_all_possible_mantissa(b, l): digits = range(b) # all possible digits with such base mantissas = get_superset(digits, l - 1) # first l - 1 digits full_mantissas = [] for digit in digits: if digit > 0: # mantissa has to start with a positive number def add_first_digit(x): return (digit, *x) # unpack tuple mantissa_starting_with_that_digit = map(add_first_digit, mantissas) full_mantissas += mantissa_starting_with_that_digit zero_mantissa = tuple([0 for _ in range(l)]) full_mantissas.append(zero_mantissa) def mantissa2string(x): return ''.join(map(str, x)) return map(mantissa2string, full_mantissas)
# Returns a list of strings. Each one of them is a exponent.
[docs]def get_all_possible_exponents(b, k): digits = range(b) # all possible digits with such base absolutes = get_superset(digits, k) positives = list(map(lst2str, absolutes)) negatives = map(lambda x: '-' + x, positives) return positives + list(negatives)
[docs]def get_all_machine_numbers(b, l, k): all_mantissas = get_all_possible_mantissa(b, l) all_exponents = get_all_possible_exponents(b, k) return [ MachineNumber(sign, mantissa, exponent) for mantissa in all_mantissas for exponent in all_exponents for sign in ['+', '-'] ]
[docs]def convert_machine_numbers(numbers, in_base): def convert(number): def convert_mantissa(mantissa, in_base): return sum( float(digit) * ((1 / in_base) ** (i + 1)) for i, digit in enumerate(mantissa) ) new_mantissa = convert_mantissa(number.mantissa, in_base) # 2 decimal new_exponent = float(int(number.exponent, in_base)) raw = number.sign + str(new_mantissa * in_base ** new_exponent) return float(raw) return map(convert, numbers)