diff --git a/changelog.md b/changelog.md index 99c0f82..ded173f 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ ## 0.0.15 * Fixed bugs in FLOOR function. +* Fixed bugs in ATAN2 ## 0.0.14 diff --git a/hotxlfp/formulas/mathtrig.py b/hotxlfp/formulas/mathtrig.py index 96458ab..9aae1e8 100644 --- a/hotxlfp/formulas/mathtrig.py +++ b/hotxlfp/formulas/mathtrig.py @@ -142,10 +142,12 @@ def ATAN2(x_num, y_num): x_num = utils.parse_number(x_num) if isinstance(x_num, error.XLError): return x_num - y_num = utils.parse_number(x_num) + y_num = utils.parse_number(y_num) if isinstance(y_num, error.XLError): return y_num - return math.atan2(x_num, y_num) + if y_num == 0: + return error.DIV_ZERO + return math.atan2(y_num, x_num) @dispatcher.register_for('ATANH') diff --git a/tests/test_mathtrig.py b/tests/test_mathtrig.py index d2b6c7a..594ce29 100644 --- a/tests/test_mathtrig.py +++ b/tests/test_mathtrig.py @@ -63,7 +63,7 @@ def test_acoth(self): def test_sin(self): p = Parser(debug=True) ret = p.parse('SIN(PI()/2)') - self.assertTrue(['result'], 1) + self.assertEqual(ret['result'], 1) self.assertEqual(ret['error'], None) ret = p.parse('SIN(1/0)') self.assertEqual(ret['result'], None) @@ -72,7 +72,7 @@ def test_sin(self): def test_sinh(self): p = Parser(debug=True) ret = p.parse('2.868*SINH(0.0342*1.03)') - self.assertTrue(['result'], 0.1010491) + self.assertAlmostEqual(ret['result'], 0.1010491, places=7) self.assertEqual(ret['error'], None) ret = p.parse('SINH(1/0)') self.assertEqual(ret['result'], None) @@ -81,7 +81,7 @@ def test_sinh(self): def test_asin(self): p = Parser(debug=True) ret = p.parse('ASIN(-0.5)') - self.assertTrue(['result'], -0.523598776) + self.assertAlmostEqual(ret['result'], -0.523598776, places=9) self.assertEqual(ret['error'], None) ret = p.parse('ASIN(1/0)') self.assertEqual(ret['result'], None) @@ -90,7 +90,7 @@ def test_asin(self): def test_asinh(self): p = Parser(debug=True) ret = p.parse('ASINH(-2.5)') - self.assertTrue(['result'], -1.647231146) + self.assertAlmostEqual(ret['result'], -1.647231146, places=9) self.assertEqual(ret['error'], None) ret = p.parse('ASINH(1/0)') self.assertEqual(ret['result'], None) @@ -99,7 +99,7 @@ def test_asinh(self): def test_cos(self): p = Parser(debug=True) ret = p.parse('COS(0)') - self.assertTrue(['result'], 1) + self.assertEqual(ret['result'], 1) self.assertEqual(ret['error'], None) ret = p.parse('COS(1/0)') self.assertEqual(ret['result'], None) @@ -108,7 +108,7 @@ def test_cos(self): def test_cosh(self): p = Parser(debug=True) ret = p.parse('COSH(4)') - self.assertTrue(['result'], 27.308233) + self.assertAlmostEqual(ret['result'], 27.308233, places=6) self.assertEqual(ret['error'], None) ret = p.parse('COSH(1/0)') self.assertEqual(ret['result'], None) @@ -129,7 +129,7 @@ def test_cot(self): def test_tan(self): p = Parser(debug=True) ret = p.parse('TAN(45*PI()/180)') - self.assertTrue(['result'], 1) + self.assertAlmostEqual(ret['result'], 1, places=9) self.assertEqual(ret['error'], None) ret = p.parse('TAN(1/0)') self.assertEqual(ret['result'], None) @@ -138,7 +138,7 @@ def test_tan(self): def test_tanh(self): p = Parser(debug=True) ret = p.parse('TANH(0.5)') - self.assertTrue(['result'], 0.462117) + self.assertAlmostEqual(ret['result'], 0.462117, places=6) self.assertEqual(ret['error'], None) ret = p.parse('TANH(1/0)') self.assertEqual(ret['result'], None) @@ -147,7 +147,7 @@ def test_tanh(self): def test_atan(self): p = Parser(debug=True) ret = p.parse('ATAN(1)*180/PI()') - self.assertTrue(['result'], 1) + self.assertEqual(ret['result'], 45) self.assertEqual(ret['error'], None) ret = p.parse('ATAN(1/0)') self.assertEqual(ret['result'], None) @@ -156,13 +156,19 @@ def test_atan(self): def test_atan2(self): p = Parser(debug=True) ret = p.parse('ATAN2(1, 1)') - self.assertTrue(['result'], 0.785398163) + self.assertAlmostEqual(ret['result'], 0.785398163, places=9) + self.assertEqual(ret['error'], None) + ret = p.parse('ATAN2(1, 0.8)') + self.assertAlmostEqual(ret['result'], 0.674740942, places=9) self.assertEqual(ret['error'], None) + ret = p.parse('ATAN2(0, 0)') + self.assertEqual(ret['result'], None) + self.assertEqual(ret['error'], '#DIV/0!') def test_atanh(self): p = Parser(debug=True) ret = p.parse('ATANH(0.76159416)') - self.assertTrue(['result'], 1.00000001) + self.assertAlmostEqual(ret['result'], 1.00000001, places=9) self.assertEqual(ret['error'], None) ret = p.parse('ATANH(1/0)') self.assertEqual(ret['result'], None) @@ -171,7 +177,7 @@ def test_atanh(self): def test_sqrt(self): p = Parser(debug=True) ret = p.parse('SQRT(16)') - self.assertTrue(['result'], 4) + self.assertEqual(ret['result'], 4) self.assertEqual(ret['error'], None) ret = p.parse('SQRT(1/0)') self.assertEqual(ret['result'], None)