aboutsummaryrefslogtreecommitdiff
path: root/src/armnnUtils/test/FloatingPointComparisonTest.cpp
blob: dab0deb5e64e949fb9869c626f4ce7ff524a985d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//
// Copyright © 2020 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <armnnUtils/FloatingPointComparison.hpp>

#include <boost/test/unit_test.hpp>

using namespace armnnUtils;

BOOST_AUTO_TEST_SUITE(FloatingPointComparisonSuite)

BOOST_AUTO_TEST_CASE(FloatingPointComparisonDefaultTolerance)
{
    // 1% range of 1.2 is 1.188 -> 1.212
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(1.2f, 1.17f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(1.2f, 1.213f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.189f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.210f));
    // Exact match
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.2f));

    // Negative value tests.
    BOOST_TEST(!within_percentage_tolerance(-1.2f, -1.17f));
    BOOST_TEST(!within_percentage_tolerance(-1.2f, -1.213f));
    BOOST_TEST(within_percentage_tolerance(-1.2f, -1.189f));
    BOOST_TEST(within_percentage_tolerance(-1.2f, -1.210f));
    BOOST_TEST(within_percentage_tolerance(-1.2f, -1.2f));

    // Negative & positive tests
    BOOST_TEST(!within_percentage_tolerance(1.2f, -1.2f));
    BOOST_TEST(!within_percentage_tolerance(-1.2f, 1.2f));

    // Negative and positive test with large float values.
    BOOST_TEST(!within_percentage_tolerance(3.3E+38f, -1.17549435e38f));
    BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, 3.3E+38f));

    // 1% range of 0.04 is 0.0396 -> 0.0404
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(0.04f, 0.039f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(0.04f, 0.04041f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(0.04f, 0.0397f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(0.04f, 0.04039f));
    // Exact match
    BOOST_TEST(within_percentage_tolerance(0.04f, 0.04f));
}

BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersDefaultTolerance)
{
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.989f)));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.011f)));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.992f)));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.009f)));
    // Exact match
    BOOST_TEST(within_percentage_tolerance(3.3E+38f, 3.3E+38f));
}

BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersDefaultTolerance)
{
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * -1.009f)));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * 1.011f)));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f - (-1.17549435e38f * 0.0099f)));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f + (-1.17549435e38f * 0.0099f)));
    // Exact match
    BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f));
}

BOOST_AUTO_TEST_CASE(FloatingPointComparisonSpecifiedTolerance)
{
    // 2% range of 1.2 is 1.176 -> 1.224
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(1.2f, 1.175f, 2.0f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(1.2f, 1.226f, 2.0f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.18f, 2.0f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.22f, 2.0f));
    // Exact match.
    BOOST_TEST(within_percentage_tolerance(1.2f, 1.2f, 2.0f));

    // 5% range of 6.2 is 5.89 -> 6.51
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(6.2f, 5.88f, 5.0f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(6.2f, 6.52f, 5.0f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(6.2f, 5.9f, 5.0f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(6.2f, 6.5f, 5.0f));

    // Larger tolerance (unlikely to be used).
    BOOST_TEST(within_percentage_tolerance(10.0f, 9.01f, 10.0f));
    BOOST_TEST(!within_percentage_tolerance(10.0f, 8.99f, 10.0f));
}

BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargePositiveNumbersSpecifiedTolerance)
{
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.979f), 2.0f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.021f), 2.0f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 0.982f), 2.0f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(3.3E+38f, (3.3E+38f * 1.019f), 2.0f));
}

BOOST_AUTO_TEST_CASE(FloatingPointComparisonLargeNegativeNumbersSpecifiedTolerance)
{
    // Just below tolerance.
    BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * -1.019f), 2.0f));
    // Just above tolerance.
    BOOST_TEST(!within_percentage_tolerance(-1.17549435e38f, (-1.17549435e38f * 1.021f), 2.0f));
    // Just inside the lower range.
    BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f - (-1.17549435e38f * 0.0089f), 2.0f));
    // Just inside the upper range.
    BOOST_TEST(within_percentage_tolerance(-1.17549435e38f, -1.17549435e38f + (-1.17549435e38f * 0.0089f), 2.0f));
}

BOOST_AUTO_TEST_SUITE_END()