Last active
August 29, 2015 14:02
-
-
Save ms5/f5f236bad5d98ed93491 to your computer and use it in GitHub Desktop.
Fuzzy compare of floats in python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
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