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