Skip to content

Instantly share code, notes, and snippets.

@ms5
Last active August 29, 2015 14:02
Show Gist options
  • Save ms5/f5f236bad5d98ed93491 to your computer and use it in GitHub Desktop.
Save ms5/f5f236bad5d98ed93491 to your computer and use it in GitHub Desktop.
Fuzzy compare of floats in python
'''
fuzzyequal: compare two floats with tolerance
float1: float value1
float2: float value2
tolerance: float tolerance applied while comparing value1 and value2
prec: int precision when comparing float (decimal places)
returns: bool (True, False)
'''
def fuzzyequal (float1, float2, tolerance=0.01, prec=4):
for arg in [float1, float2, tolerance]:
if type(arg) is not float:
raise TypeError('only float type supported')
return round(abs(float1 - float2),prec) < tolerance
'''
Same idea as above, but this time do not throw an exception on not float type,
instead doing a "normal" comparision of the two arguments
'''
def fuzzyequalIfFloat(val1, val2, tolerance=0.01, prec=4):
for arg in [val1, val2, tolerance]:
if type(arg) is not float:
return val1==val2
return fuzzyequal(val1,val2, tolerance=tolerance, prec=prec)
import unittest
class TestSequenceFunctions(unittest.TestCase):
def testpositivefloats(self):
self.assertEqual(fuzzyequal(1.20, 1.189, tolerance=0.01), False)
self.assertEqual(fuzzyequal(1.20, 1.190, tolerance=0.01), False)
self.assertEqual(fuzzyequal(1.20, 1.191, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.192, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.193, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.194, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.195, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.196, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.197, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.198, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.199, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.200, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.201, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.202, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.203, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.204, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.205, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.206, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.207, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.208, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.209, tolerance=0.01), True)
self.assertEqual(fuzzyequal(1.20, 1.210, tolerance=0.01), False)
self.assertEqual(fuzzyequal(1.20, 1.211, tolerance=0.01), False)
self.assertEqual(fuzzyequal(0.20, 0.189, tolerance=0.01), False)
self.assertEqual(fuzzyequal(0.20, 0.190, tolerance=0.01), False)
self.assertEqual(fuzzyequal(0.20, 0.191, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.192, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.193, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.194, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.195, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.196, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.197, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.198, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.199, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.200, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.201, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.202, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.203, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.204, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.205, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.206, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.207, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.208, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.209, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.20, 0.210, tolerance=0.01), False)
self.assertEqual(fuzzyequal(0.20, 0.211, tolerance=0.01), False)
def testpositivenegativefloats(self):
self.assertEqual(fuzzyequal(0.000, -0.000, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.001, -0.001, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.002, -0.002, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.003, -0.003, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.004, -0.004, tolerance=0.01), True)
self.assertEqual(fuzzyequal(0.005, -0.005, tolerance=0.01), False)
def testnagativefloats(self):
self.assertEqual(fuzzyequal(-1.20, -1.189, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-1.20, -1.190, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-1.20, -1.191, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.192, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.193, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.194, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.195, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.196, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.197, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.198, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.199, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.200, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.201, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.202, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.203, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.204, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.205, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.206, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.207, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.208, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.209, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-1.20, -1.210, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-1.20, -1.211, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-0.20, -0.189, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-0.20, -0.190, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-0.20, -0.191, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.192, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.193, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.194, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.195, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.196, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.197, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.198, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.199, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.200, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.201, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.202, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.203, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.204, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.205, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.206, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.207, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.208, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.209, tolerance=0.01), True)
self.assertEqual(fuzzyequal(-0.20, -0.210, tolerance=0.01), False)
self.assertEqual(fuzzyequal(-0.20, -0.211, tolerance=0.01), False)
def testfloatnonfloatequal(self):
self.assertRaises(TypeError, fuzzyequal, 1, 1.001, tolerance=0.01)
self.assertRaises(TypeError, fuzzyequal, 1.001, 1, tolerance=0.01)
self.assertRaises(TypeError, fuzzyequal, 1.001, 'im a string', tolerance=0.01)
self.assertRaises(TypeError, fuzzyequal, 'im a string', 1.001, tolerance=0.01)
def testfuzzyequalIfFloat(self):
self.assertEqual(fuzzyequalIfFloat(1, 1, tolerance=0.01), True)
self.assertEqual(fuzzyequalIfFloat(1, 0, tolerance=0.01), False)
self.assertEqual(fuzzyequalIfFloat(0, 1, tolerance=0.01), False)
self.assertEqual(fuzzyequalIfFloat('string', 'string', tolerance=0.01), True)
self.assertEqual(fuzzyequalIfFloat('string1', 'string2', tolerance=0.01), False)
self.assertEqual(fuzzyequalIfFloat(1.001, 1.002, tolerance=0.01), True)
self.assertEqual(fuzzyequalIfFloat(1.001, 1.030, tolerance=0.01), False)
if __name__ == '__main__':
unittest.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment