fix #12, fixed rounding error, code refactor

This commit is contained in:
Rossen Georgiev 2016-01-19 08:30:24 +00:00
parent d45795aa24
commit 87f0bfd1bf
3 changed files with 21 additions and 9 deletions

View File

@ -20,10 +20,16 @@ Provides facilities for covertion from/to base91
"""
__all__ = ['to_decimal', 'from_decimal']
from math import log
from math import log, ceil
import sys
from re import findall
from . import string_type, int_type
if sys.version_info < (3,):
_range = xrange
else:
_range = range
def to_decimal(text):
"""
@ -36,6 +42,7 @@ def to_decimal(text):
if findall(r"[\x00-\x20\x7c-\xff]", text):
raise ValueError("invalid character in sequence")
text = text.lstrip('!')
decimal = 0
length = len(text) - 1
for i, char in enumerate(text):
@ -60,12 +67,15 @@ def from_decimal(number, padding=1):
elif padding < 1:
raise ValueError("Expected padding to be >0")
elif number > 0:
for divisor in [91**e for e in reversed(range(int(log(number) / log(91)) + 1))]:
quotient = number // divisor
number = number % divisor
max_n = ceil(log(number) / log(91))
for n in _range(int(max_n), -1, -1):
quotient, number = divmod(number, 91**n)
text.append(chr(33 + quotient))
# add padding if necessary
text = ['!'] * (padding-len(text)) + text
text = "".join(text).lstrip('!')
return "".join(text)
# add padding if necessary
text = '!' * (padding-len(text)) + text
return text

View File

@ -24,7 +24,9 @@ setup(
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License v2 (GPLv2)',
'Programming Language :: Python',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: Implementation :: PyPy',
'Topic :: Communications :: Ham Radio',
],
test_suite='tests',

View File

@ -104,7 +104,7 @@ class c_Both(unittest.TestCase):
self.assertEqual(result, number)
def test_stability(self):
for number in range(50):
for number in range(200):
largeN = 91 ** number
text = base91.from_decimal(largeN)
result = base91.to_decimal(text)