32 #define TEST_NAME "util/math"
43 BOOST_CHECK_EQUAL(
SignOfNumber(std::numeric_limits<float>::quiet_NaN()), 0);
44 BOOST_CHECK_EQUAL(
SignOfNumber(std::numeric_limits<float>::infinity()), 1);
45 BOOST_CHECK_EQUAL(
SignOfNumber(-std::numeric_limits<float>::infinity()), -1);
49 BOOST_CHECK(!
IsNaN(0.0f));
50 BOOST_CHECK(!
IsNaN(0.0));
51 BOOST_CHECK(
IsNaN(std::numeric_limits<float>::quiet_NaN()));
52 BOOST_CHECK(
IsNaN(std::numeric_limits<double>::quiet_NaN()));
56 BOOST_CHECK(!
IsInf(0.0f));
57 BOOST_CHECK(!
IsInf(0.0));
58 BOOST_CHECK(
IsInf(std::numeric_limits<float>::infinity()));
59 BOOST_CHECK(
IsInf(std::numeric_limits<double>::infinity()));
60 BOOST_CHECK(
IsInf(-std::numeric_limits<float>::infinity()));
61 BOOST_CHECK(
IsInf(-std::numeric_limits<double>::infinity()));
65 BOOST_CHECK_EQUAL(
Clip(0, -1, 1), 0);
66 BOOST_CHECK_EQUAL(
Clip(0, 0, 1), 0);
67 BOOST_CHECK_EQUAL(
Clip(0, -1, 0), 0);
68 BOOST_CHECK_EQUAL(
Clip(0, -1, 1), 0);
69 BOOST_CHECK_EQUAL(
Clip(0, 1, 2), 1);
70 BOOST_CHECK_EQUAL(
Clip(0, -2, -1), -1);
71 BOOST_CHECK_EQUAL(
Clip(0, 0, 0), 0);
75 BOOST_CHECK_EQUAL(
DegToRad(0.0f), 0.0f);
76 BOOST_CHECK_EQUAL(
DegToRad(0.0), 0.0);
77 BOOST_CHECK_LT(std::abs(
DegToRad(180.0f) -
M_PI), 1e-6f);
82 BOOST_CHECK_EQUAL(
RadToDeg(0.0f), 0.0f);
83 BOOST_CHECK_EQUAL(
RadToDeg(0.0), 0.0);
84 BOOST_CHECK_LT(std::abs(
RadToDeg(
M_PI) - 180.0f), 1e-6f);
89 BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 4}), 2.5);
90 BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 100}), 2.5);
91 BOOST_CHECK_EQUAL(Median<int>({1, 2, 3, 4, 100}), 3);
92 BOOST_CHECK_EQUAL(Median<int>({-100, 1, 2, 3, 4}), 2);
93 BOOST_CHECK_EQUAL(Median<int>({-1, -2, -3, -4}), -2.5);
94 BOOST_CHECK_EQUAL(Median<int>({-1, -2, 3, 4}), 1);
98 BOOST_CHECK_EQUAL(Percentile<int>({0}, 0), 0);
99 BOOST_CHECK_EQUAL(Percentile<int>({0}, 50), 0);
100 BOOST_CHECK_EQUAL(Percentile<int>({0}, 100), 0);
101 BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 0), 0);
102 BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 50), 1);
103 BOOST_CHECK_EQUAL(Percentile<int>({0, 1}, 100), 1);
104 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 0), 0);
105 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 50), 1);
106 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 2}, 100), 2);
107 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 0), 0);
108 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 33), 1);
109 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 50), 1);
110 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 66), 1);
111 BOOST_CHECK_EQUAL(Percentile<int>({0, 1, 1, 2}, 100), 2);
115 BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 4}), 2.5);
116 BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 100}), 26.5);
117 BOOST_CHECK_EQUAL(Mean<int>({1, 2, 3, 4, 100}), 22);
118 BOOST_CHECK_EQUAL(Mean<int>({-100, 1, 2, 3, 4}), -18);
119 BOOST_CHECK_EQUAL(Mean<int>({-1, -2, -3, -4}), -2.5);
120 BOOST_CHECK_EQUAL(Mean<int>({-1, -2, 3, 4}), 1);
124 BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 4}) - 1.66666666), 1
e-6);
125 BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 100}) - 2401.66666666), 1
e-6);
126 BOOST_CHECK_LE(std::abs(Variance<int>({1, 2, 3, 4, 100}) - 1902.5), 1
e-6);
127 BOOST_CHECK_LE(std::abs(Variance<int>({-100, 1, 2, 3, 4}) - 2102.5), 1
e-6);
128 BOOST_CHECK_LE(std::abs(Variance<int>({-1, -2, -3, -4}) - 1.66666666), 1
e-6);
129 BOOST_CHECK_LE(std::abs(Variance<int>({-1, -2, 3, 4}) - 8.66666666), 1
e-6);
133 BOOST_CHECK_LE(std::abs(std::sqrt(Variance<int>({1, 2, 3, 4})) -
134 StdDev<int>({1, 2, 3, 4})),
136 BOOST_CHECK_LE(std::abs(std::sqrt(Variance<int>({1, 2, 3, 100})) -
137 StdDev<int>({1, 2, 3, 100})),
142 BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 5));
143 BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 4));
144 BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 3));
145 BOOST_CHECK(AnyLessThan<int>({1, 2, 3, 4}, 2));
146 BOOST_CHECK(!AnyLessThan<int>({1, 2, 3, 4}, 1));
147 BOOST_CHECK(!AnyLessThan<int>({1, 2, 3, 4}, 0));
151 BOOST_CHECK(!AnyGreaterThan<int>({1, 2, 3, 4}, 5));
152 BOOST_CHECK(!AnyGreaterThan<int>({1, 2, 3, 4}, 4));
153 BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 3));
154 BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 2));
155 BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 1));
156 BOOST_CHECK(AnyGreaterThan<int>({1, 2, 3, 4}, 0));
160 std::vector<int> list{0};
161 BOOST_CHECK(!
NextCombination(list.begin(), list.begin() + 1, list.end()));
163 BOOST_CHECK(!
NextCombination(list.begin(), list.begin() + 2, list.end()));
164 BOOST_CHECK_EQUAL(list[0], 0);
165 BOOST_CHECK(
NextCombination(list.begin(), list.begin() + 1, list.end()));
166 BOOST_CHECK_EQUAL(list[0], 1);
167 BOOST_CHECK(!
NextCombination(list.begin(), list.begin() + 1, list.end()));
168 BOOST_CHECK_EQUAL(list[0], 0);
170 BOOST_CHECK_EQUAL(list[0], 0);
171 BOOST_CHECK_EQUAL(list[1], 1);
172 BOOST_CHECK_EQUAL(list[2], 2);
173 BOOST_CHECK(
NextCombination(list.begin(), list.begin() + 2, list.end()));
174 BOOST_CHECK_EQUAL(list[0], 0);
175 BOOST_CHECK_EQUAL(list[1], 2);
176 BOOST_CHECK_EQUAL(list[2], 1);
177 BOOST_CHECK(
NextCombination(list.begin(), list.begin() + 2, list.end()));
178 BOOST_CHECK_EQUAL(list[0], 1);
179 BOOST_CHECK_EQUAL(list[1], 2);
180 BOOST_CHECK_EQUAL(list[2], 0);
181 BOOST_CHECK(!
NextCombination(list.begin(), list.begin() + 2, list.end()));
182 BOOST_CHECK_EQUAL(list[0], 0);
183 BOOST_CHECK_EQUAL(list[1], 1);
184 BOOST_CHECK_EQUAL(list[2], 2);
188 BOOST_CHECK_EQUAL(
Sigmoid(0.0), 0.5);
189 BOOST_CHECK_CLOSE(
Sigmoid(100.0), 1.0, 1
e-10);
190 BOOST_CHECK_SMALL(
Sigmoid(-100.0), 1
e-10);
200 BOOST_CHECK_EQUAL(
NChooseK(1, 0), 1);
201 BOOST_CHECK_EQUAL(
NChooseK(2, 0), 1);
202 BOOST_CHECK_EQUAL(
NChooseK(3, 0), 1);
204 BOOST_CHECK_EQUAL(
NChooseK(1, 1), 1);
205 BOOST_CHECK_EQUAL(
NChooseK(2, 1), 2);
206 BOOST_CHECK_EQUAL(
NChooseK(3, 1), 3);
208 BOOST_CHECK_EQUAL(
NChooseK(2, 2), 1);
209 BOOST_CHECK_EQUAL(
NChooseK(2, 3), 0);
211 BOOST_CHECK_EQUAL(
NChooseK(3, 2), 3);
212 BOOST_CHECK_EQUAL(
NChooseK(4, 2), 6);
213 BOOST_CHECK_EQUAL(
NChooseK(5, 2), 10);
215 BOOST_CHECK_EQUAL(
NChooseK(500, 3), 20708500);
219 BOOST_CHECK_EQUAL((TruncateCast<int, int8_t>(-129)), -128);
220 BOOST_CHECK_EQUAL((TruncateCast<int, int8_t>(128)), 127);
221 BOOST_CHECK_EQUAL((TruncateCast<int, uint8_t>(-1)), 0);
222 BOOST_CHECK_EQUAL((TruncateCast<int, uint8_t>(256)), 255);
223 BOOST_CHECK_EQUAL((TruncateCast<int, uint16_t>(-1)), 0);
224 BOOST_CHECK_EQUAL((TruncateCast<int, uint16_t>(65536)), 65535);
BOOST_AUTO_TEST_CASE(TestSignOfNumber)
float RadToDeg(const float rad)
T Sigmoid(const T x, const T alpha=1)
bool NextCombination(Iterator first, Iterator middle, Iterator last)
int SignOfNumber(const T val)
T ScaleSigmoid(T x, const T alpha=1, const T x0=10)
size_t NChooseK(const size_t n, const size_t k)
bool IsNaN(const float x)
float DegToRad(const float deg)
T Clip(const T &value, const T &low, const T &high)
bool IsInf(const float x)