def t_number(self, t): r''' ( (?# Two possible forms depending on whether base is specified) (\d+\^\^([a-zA-Z0-9]+\.?[a-zA-Z0-9]*|[a-zA-Z0-9]*\.?[a-zA-Z0-9]+)) | (\d+\.?\d*|\d*\.?\d+) ) (``?(\+|-)?(\d+\.?\d*|\d*\.?\d+)|`)? (?# Precision / Accuracy) (\*\^(\+|-)?\d+)? (?# Exponent) ''' s = t.value # Look for base s = s.split('^^') if len(s) == 1: base, s = 10, s[0] else: assert len(s) == 2 base, s = int(s[0]), s[1] assert 2 <= base <= 36 # Look for mantissa s = s.split('*^') if len(s) == 1: n, s = 0, s[0] else: # TODO: modify regex and provide error message if n not an int n, s = int(s[1]), s[0] # Look at precision ` suffix to get precision/accuracy prec, acc = None, None s = s.split('`', 1) if len(s) == 1: suffix, s = None, s[0] else: suffix, s = s[1], s[0] if suffix == '': prec = machine_precision elif suffix.startswith('`'): acc = float(suffix[1:]) else: if re.match('0+$', s) is not None: t.value = Integer(0) return t prec = float(suffix) # Look for decimal point if s.count('.') == 0: if suffix is None: if n < 0: t.value = Rational(int(s, base), base ** abs(n)) else: t.value = Integer(int(s, base) * (base ** n)) return t else: s = s + '.' if base == 10: if n != 0: s = s + 'E' + str(n) # sympy handles this if acc is not None: if float(s) == 0: prec = 0. else: prec = acc + log10(float(s)) + n # XXX if prec is not None: prec = dps(prec) t.value = Real(s, prec) # t.value = Real(s, prec, acc) else: # Convert the base assert isinstance(base, int) and 2 <= base <= 36 # Put into standard form mantissa * base ^ n s = s.split('.') if len(s) == 1: man = s[0] else: n -= len(s[1]) man = s[0] + s[1] man = int(man, base) if n >= 0: result = Integer(man * base ** n) else: result = Rational(man, base ** -n) if acc is None and prec is None: acc = len(s[1]) acc10 = acc * log10(base) prec10 = acc10 + log10(result.to_python()) if prec10 < 18: prec10 = None elif acc is not None: acc10 = acc * log10(base) prec10 = acc10 + log10(result.to_python()) elif prec is not None: if prec == machine_precision: prec10 = machine_precision else: prec10 = prec * log10(base) # XXX if prec10 is None: prec10 = machine_precision else: prec10 = dps(prec10) t.value = result.round(prec10) return t
def t_number(self, t): r''' ( (?# Two possible forms depending on whether base is specified) (\d+\^\^([a-zA-Z0-9]+\.?[a-zA-Z0-9]*|[a-zA-Z0-9]*\.?[a-zA-Z0-9]+)) | (\d+\.?\d*|\d*\.?\d+) ) (``?(\+|-)?(\d+\.?\d*|\d*\.?\d+)|`)? (?# Precision / Accuracy) (\*\^(\+|-)?\d+)? (?# Exponent) ''' s = t.value # Look for base s = s.split('^^') if len(s) == 1: base, s = 10, s[0] else: assert len(s) == 2 base, s = int(s[0]), s[1] assert 2 <= base <= 36 # Look for mantissa s = s.split('*^') if len(s) == 1: n, s = 0, s[0] else: #TODO: modify regex and provide error message if n not an int n, s = int(s[1]), s[0] # Look at precision ` suffix to get precision/accuracy prec, acc = None, None s = s.split('`', 1) if len(s) == 1: suffix, s = None, s[0] else: suffix, s = s[1], s[0] if suffix == '': prec = machine_precision elif suffix.startswith('`'): acc = float(suffix[1:]) else: if re.match('0+$', s) is not None: t.value = Integer(0) return t prec = float(suffix) # Look for decimal point if s.count('.') == 0: if suffix is None: if n < 0: t.value = Rational(int(s, base), base**abs(n)) else: t.value = Integer(int(s, base) * (base**n)) return t else: s = s + '.' if base == 10: if n != 0: s = s + 'E' + str(n) # sympy handles this if acc is not None: if float(s) == 0: prec = 0. else: prec = acc + log10(float(s)) + n #XXX if prec is not None: prec = dps(prec) t.value = Real(s, prec) #t.value = Real(s, prec, acc) else: # Convert the base assert isinstance(base, int) and 2 <= base <= 36 # Put into standard form mantissa * base ^ n s = s.split('.') if len(s) == 1: man = s[0] else: n -= len(s[1]) man = s[0] + s[1] man = int(man, base) if n >= 0: result = Integer(man * base**n) else: result = Rational(man, base**-n) if acc is None and prec is None: acc = len(s[1]) acc10 = acc * log10(base) prec10 = acc10 + log10(result.to_python()) if prec10 < 18: prec10 = None elif acc is not None: acc10 = acc * log10(base) prec10 = acc10 + log10(result.to_python()) elif prec is not None: if prec == machine_precision: prec10 = machine_precision else: prec10 = prec * log10(base) #XXX if prec10 is None: prec10 = machine_precision else: prec10 = dps(prec10) t.value = result.round(prec10) return t