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