#!/usr/bin/python3 def applyfuzz(val, old, fuzz): if not fuzz: return val # within half of the fuzz range, return value if val > old - fuzz/2 and val < old + fuzz/2: return old # within 0.5 to 1.0 times fuzz, return if val > old - fuzz and val < old + fuzz: return int((old * 3 + val)/4) if val > old - fuzz * 2 and val < old + fuzz * 2: return int((old + val)/2) return val def defuzz(val, fuzz): if val == 0: return 0 if val < fuzz/2: return val * 4 + 1 if val < fuzz: return val * 2 else: return val fuzz = 8 old = 100 for v in range(-fuzz * 3, fuzz * 3): val = old + v defuzzed = applyfuzz(val, old, fuzz) dv = defuzz(defuzzed, fuzz) #warning = '*' if val != 0 and v - dv > 3 else '' print((f'value {val:-3d} old_val {old:-3d}: defuzzed: {defuzzed:-3d} ' f'delta {defuzzed - old:-3d}|{v:-3d} error: {val - defuzzed:-3d} ' #f'unfuzzed: {dv:-3d} error: {val - dv:-3d}' )) #defuzzed: {dv} error {v - dv} {warning}')