You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

#### 97 lines 2.2 KiB Python Raw Normal View History Unescape Escape

 `#!/usr/bin/env python3` ``` ``` `import math` `import operator` `import sys` ``` ``` ``` ``` `def rem(a, b):` ` ret = a % b` ` if ret < 0 and a > 0 and b < 0 or \` ` ret > 0 and a < 0 and b > 0:` ` ret -= b` ` return ret` ``` ``` ``` ``` `FUNS = {` ` 'add': operator.add,` ` 'sub': operator.sub,` ` 'mul': operator.mul,` ` 'div': operator.truediv,` ` 'mod': rem,` ``` ``` ` 'sadd': operator.add,` ` 'ssub': operator.sub,` ` 'smul': operator.mul,` ` 'sdiv': operator.truediv,` ``` ``` ` 'min': min,` ` 'max': max,` ``` ``` ` 'abs': abs,` ` 'sqrt': math.sqrt,` ` 'sq': lambda x: x * x,` ``` ``` ` 'sin': math.sin,` ` 'cos': math.cos,` ` 'tan': math.tan,` ` 'asin': math.asin,` ` 'acos': math.acos,` ` 'atan': math.atan,` ``` ``` ` 'exp': math.exp,` ` 'log': math.log,` ` 'log2': math.log2,` ` 'slog2': math.log2,` `}` ``` ``` `ABS_ERROR_LIMIT = 0.011` ``` ``` `def main():` ` total = 0` ` errors = 0` ``` ``` ` print('Calculation: abs result != exp result, abs error > limit')` ``` ``` ` started = False` ` for line in sys.stdin:` ` line = line.strip()` ` if not started:` ` if line == 'Unary.':` ` print(line)` ` started = True` ` continue` ` elif line == 'Binary.':` ` print(line)` ` continue` ` elif line == 'Done.':` ` print(line)` ` break` ``` ``` ` total += 1` ` try:` ` res_locals = {}` ` res_locals['input'], res_locals['expected'] = map(str.strip, line.split('='))` ` exec('result = {}'.format(res_locals['input']), FUNS, res_locals)` ``` ``` ` abs_error = abs(res_locals['result'] - float(res_locals['expected']))` ` res_locals['result'] = '{:.4f}'.format(res_locals['result'])` ` if abs_error > ABS_ERROR_LIMIT:` ` print('{}: {} != {}, {:.4f} > {}'.format(res_locals['input'], res_locals['result'], res_locals['expected'],` ` abs_error, ABS_ERROR_LIMIT))` ` errors += 1` ` except:` ` errors += 1` ` print('ERROR {}'.format(line))` ``` ``` ` print('{} calculations passed.'.format(total - errors))` ` if errors:` ` print('{} calculations had errors.'.format(errors))` ` return 1` ` else:` ` return 0` ``` ``` ``` ``` `if __name__ == '__main__':` ` sys.exit(main())`