• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2020 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <armnnUtils/FloatingPointComparison.hpp>
7 
8 #include <boost/test/unit_test.hpp>
9 
10 using namespace armnnUtils;
11 
12 BOOST_AUTO_TEST_SUITE(FloatingPointComparisonSuite)
13 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonDefaultTolerance)14 BOOST_AUTO_TEST_CASE(FloatingPointComparisonDefaultTolerance)
15 {
16     // 1% range of 1.2 is 1.188 -> 1.212
17     // Just below tolerance.
18     BOOST_TEST(!within_percentage_tolerance(1.2f, 1.17f));
19     // Just above tolerance.
20     BOOST_TEST(!within_percentage_tolerance(1.2f, 1.213f));
21     // Just inside the lower range.
22     BOOST_TEST(within_percentage_tolerance(1.2f, 1.189f));
23     // Just inside the upper range.
24     BOOST_TEST(within_percentage_tolerance(1.2f, 1.210f));
25     // Exact match
26     BOOST_TEST(within_percentage_tolerance(1.2f, 1.2f));
27 
28     // Negative value tests.
29     BOOST_TEST(!within_percentage_tolerance(-1.2f, -1.17f));
30     BOOST_TEST(!within_percentage_tolerance(-1.2f, -1.213f));
31     BOOST_TEST(within_percentage_tolerance(-1.2f, -1.189f));
32     BOOST_TEST(within_percentage_tolerance(-1.2f, -1.210f));
33     BOOST_TEST(within_percentage_tolerance(-1.2f, -1.2f));
34 
35     // Negative & positive tests
36     BOOST_TEST(!within_percentage_tolerance(1.2f, -1.2f));
37     BOOST_TEST(!within_percentage_tolerance(-1.2f, 1.2f));
38 
39     // Negative and positive test with large float values.
40     BOOST_TEST(!within_percentage_tolerance(3.3E+38f, -1.17549435e38f));
41     BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, 3.3E+38f));
42 
43     // 1% range of 0.04 is 0.0396 -> 0.0404
44     // Just below tolerance.
45     BOOST_TEST(!within_percentage_tolerance(0.04f, 0.039f));
46     // Just above tolerance.
47     BOOST_TEST(!within_percentage_tolerance(0.04f, 0.04041f));
48     // Just inside the lower range.
49     BOOST_TEST(within_percentage_tolerance(0.04f, 0.0397f));
50     // Just inside the upper range.
51     BOOST_TEST(within_percentage_tolerance(0.04f, 0.04039f));
52     // Exact match
53     BOOST_TEST(within_percentage_tolerance(0.04f, 0.04f));
54 }
55 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersDefaultTolerance)56 BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersDefaultTolerance)
57 {
58     // Just below tolerance.
59     BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.989f)));
60     // Just above tolerance.
61     BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.011f)));
62     // Just inside the lower range.
63     BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.992f)));
64     // Just inside the upper range.
65     BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.009f)));
66     // Exact match
67     BOOST_TEST(within_percentage_tolerance(3.3E+38f, 3.3E+38f));
68 }
69 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersDefaultTolerance)70 BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersDefaultTolerance)
71 {
72     // Just below tolerance.
73     BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * -1.009f)));
74     // Just above tolerance.
75     BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * 1.011f)));
76     // Just inside the lower range.
77     BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f - (-1.17549435e38f * 0.0099f)));
78     // Just inside the upper range.
79     BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f + (-1.17549435e38f * 0.0099f)));
80     // Exact match
81     BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f));
82 }
83 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonSpecifiedTolerance)84 BOOST_AUTO_TEST_CASE(FloatingPointComparisonSpecifiedTolerance)
85 {
86     // 2% range of 1.2 is 1.176 -> 1.224
87     // Just below tolerance.
88     BOOST_TEST(!within_percentage_tolerance(1.2f, 1.175f, 2.0f));
89     // Just above tolerance.
90     BOOST_TEST(!within_percentage_tolerance(1.2f, 1.226f, 2.0f));
91     // Just inside the lower range.
92     BOOST_TEST(within_percentage_tolerance(1.2f, 1.18f, 2.0f));
93     // Just inside the upper range.
94     BOOST_TEST(within_percentage_tolerance(1.2f, 1.22f, 2.0f));
95     // Exact match.
96     BOOST_TEST(within_percentage_tolerance(1.2f, 1.2f, 2.0f));
97 
98     // 5% range of 6.2 is 5.89 -> 6.51
99     // Just below tolerance.
100     BOOST_TEST(!within_percentage_tolerance(6.2f, 5.88f, 5.0f));
101     // Just above tolerance.
102     BOOST_TEST(!within_percentage_tolerance(6.2f, 6.52f, 5.0f));
103     // Just inside the lower range.
104     BOOST_TEST(within_percentage_tolerance(6.2f, 5.9f, 5.0f));
105     // Just inside the upper range.
106     BOOST_TEST(within_percentage_tolerance(6.2f, 6.5f, 5.0f));
107 
108     // Larger tolerance (unlikely to be used).
109     BOOST_TEST(within_percentage_tolerance(10.0f, 9.01f, 10.0f));
110     BOOST_TEST(!within_percentage_tolerance(10.0f, 8.99f, 10.0f));
111 }
112 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersSpecifiedTolerance)113 BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersSpecifiedTolerance)
114 {
115     // Just below tolerance.
116     BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.979f), 2.0f));
117     // Just above tolerance.
118     BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.021f), 2.0f));
119     // Just inside the lower range.
120     BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.982f), 2.0f));
121     // Just inside the upper range.
122     BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.019f), 2.0f));
123 }
124 
BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersSpecifiedTolerance)125 BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersSpecifiedTolerance)
126 {
127     // Just below tolerance.
128     BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * -1.019f), 2.0f));
129     // Just above tolerance.
130     BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * 1.021f), 2.0f));
131     // Just inside the lower range.
132     BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f - (-1.17549435e38f * 0.0089f), 2.0f));
133     // Just inside the upper range.
134     BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f + (-1.17549435e38f * 0.0089f), 2.0f));
135 }
136 
137 BOOST_AUTO_TEST_SUITE_END()
138