blob: b4f5b1427a9fe05de9c7a91807d0a630e03cea69 [file] [log] [blame]
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Narayan Kamath5f6f4a92014-02-19 15:42:58 +000017// This include (and the associated definition of __test_capture_signbit)
18// must be placed before any files that include <cmath> (gtest.h in this case).
19//
20// <math.h> is required to define generic macros signbit, isfinite and
21// several other such functions.
22//
23// <cmath> is required to undef declarations of these macros in the global
24// namespace and make equivalent functions available in namespace std. Our
25// stlport implementation does this only for signbit, isfinite, isinf and
26// isnan.
27//
28// NOTE: We don't write our test using std::signbit because we want to be
29// sure that we're testing the bionic version of signbit. The C++ libraries
30// are free to reimplement signbit or delegate to compiler builtins if they
31// please.
32#include <math.h>
33
34namespace {
35template<typename T> inline int test_capture_signbit(const T in) {
36 return signbit(in);
37}
38template<typename T> inline int test_capture_isfinite(const T in) {
39 return isfinite(in);
40}
41template<typename T> inline int test_capture_isnan(const T in) {
42 return isnan(in);
43}
44template<typename T> inline int test_capture_isinf(const T in) {
45 return isinf(in);
46}
47}
48
Elliott Hughesa0ee0782013-01-30 19:06:37 -080049#include <gtest/gtest.h>
50
51#include <fenv.h>
Brian Carlstrom133bd092014-03-24 16:45:18 -070052#include <float.h>
Elliott Hughesa0ee0782013-01-30 19:06:37 -080053#include <limits.h>
Elliott Hughesa0ee0782013-01-30 19:06:37 -080054#include <stdint.h>
55
56float float_subnormal() {
57 union {
58 float f;
59 uint32_t i;
60 } u;
61 u.i = 0x007fffff;
62 return u.f;
63}
64
65double double_subnormal() {
66 union {
67 double d;
68 uint64_t i;
69 } u;
Elliott Hughes52276632013-02-12 20:18:49 -080070 u.i = 0x000fffffffffffffLL;
Elliott Hughesa0ee0782013-01-30 19:06:37 -080071 return u.d;
72}
73
Calin Juravle4d77c112014-03-14 17:56:46 +000074long double ldouble_subnormal() {
75 union {
76 long double e;
77 unsigned char c[sizeof(long double)];
78 } u;
79
80 // Subnormals must have a zero exponent and non zero significand.
81 // On all supported representation the 17 bit (counting from either sides)
82 // is part of the significand so it should be enough to set that.
83 // It also applies for the case sizeof(double) = sizeof(long double)
84 for (unsigned int i = 0; i < sizeof(long double); i++) {
85 u.c[i] = 0x00;
86 }
87 u.c[sizeof(long double) - 3] = 0x80;
88 u.c[2] = 0x80;
89
90 return u.e;
91}
92
Elliott Hughesa0ee0782013-01-30 19:06:37 -080093TEST(math, fpclassify) {
94 ASSERT_EQ(FP_INFINITE, fpclassify(INFINITY));
95 ASSERT_EQ(FP_INFINITE, fpclassify(HUGE_VALF));
96 ASSERT_EQ(FP_INFINITE, fpclassify(HUGE_VAL));
Calin Juravle4d77c112014-03-14 17:56:46 +000097 ASSERT_EQ(FP_INFINITE, fpclassify(HUGE_VALL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -080098
99 ASSERT_EQ(FP_NAN, fpclassify(nanf("")));
100 ASSERT_EQ(FP_NAN, fpclassify(nan("")));
Calin Juravle4d77c112014-03-14 17:56:46 +0000101 ASSERT_EQ(FP_NAN, fpclassify(nanl("")));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800102
103 ASSERT_EQ(FP_NORMAL, fpclassify(1.0f));
104 ASSERT_EQ(FP_NORMAL, fpclassify(1.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100105 ASSERT_EQ(FP_NORMAL, fpclassify(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800106
107 ASSERT_EQ(FP_SUBNORMAL, fpclassify(float_subnormal()));
108 ASSERT_EQ(FP_SUBNORMAL, fpclassify(double_subnormal()));
Calin Juravle4d77c112014-03-14 17:56:46 +0000109 ASSERT_EQ(FP_SUBNORMAL, fpclassify(ldouble_subnormal()));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800110
111 ASSERT_EQ(FP_ZERO, fpclassify(0.0f));
112 ASSERT_EQ(FP_ZERO, fpclassify(0.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100113 ASSERT_EQ(FP_ZERO, fpclassify(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800114}
115
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800116TEST(math, isfinite) {
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000117 ASSERT_TRUE(test_capture_isfinite(123.0f));
118 ASSERT_TRUE(test_capture_isfinite(123.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100119 ASSERT_TRUE(test_capture_isfinite(123.0L));
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000120 ASSERT_FALSE(test_capture_isfinite(HUGE_VALF));
121 ASSERT_FALSE(test_capture_isfinite(HUGE_VAL));
Calin Juravle4d77c112014-03-14 17:56:46 +0000122 ASSERT_FALSE(test_capture_isfinite(HUGE_VALL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800123}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800124
125TEST(math, isinf) {
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000126 ASSERT_FALSE(test_capture_isinf(123.0f));
127 ASSERT_FALSE(test_capture_isinf(123.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100128 ASSERT_FALSE(test_capture_isinf(123.0L));
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000129 ASSERT_TRUE(test_capture_isinf(HUGE_VALF));
130 ASSERT_TRUE(test_capture_isinf(HUGE_VAL));
Calin Juravle4d77c112014-03-14 17:56:46 +0000131 ASSERT_TRUE(test_capture_isinf(HUGE_VALL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800132}
133
134TEST(math, isnan) {
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000135 ASSERT_FALSE(test_capture_isnan(123.0f));
136 ASSERT_FALSE(test_capture_isnan(123.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100137 ASSERT_FALSE(test_capture_isnan(123.0L));
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000138 ASSERT_TRUE(test_capture_isnan(nanf("")));
139 ASSERT_TRUE(test_capture_isnan(nan("")));
Calin Juravle4d77c112014-03-14 17:56:46 +0000140 ASSERT_TRUE(test_capture_isnan(nanl("")));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800141}
142
143TEST(math, isnormal) {
144 ASSERT_TRUE(isnormal(123.0f));
145 ASSERT_TRUE(isnormal(123.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100146 ASSERT_TRUE(isnormal(123.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800147 ASSERT_FALSE(isnormal(float_subnormal()));
148 ASSERT_FALSE(isnormal(double_subnormal()));
Calin Juravle4d77c112014-03-14 17:56:46 +0000149 ASSERT_FALSE(isnormal(ldouble_subnormal()));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800150}
151
152// TODO: isgreater, isgreaterequals, isless, islessequal, islessgreater, isunordered
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800153TEST(math, signbit) {
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000154 ASSERT_EQ(0, test_capture_signbit(0.0f));
155 ASSERT_EQ(0, test_capture_signbit(0.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100156 ASSERT_EQ(0, test_capture_signbit(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800157
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000158 ASSERT_EQ(0, test_capture_signbit(1.0f));
159 ASSERT_EQ(0, test_capture_signbit(1.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100160 ASSERT_EQ(0, test_capture_signbit(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800161
Narayan Kamath5f6f4a92014-02-19 15:42:58 +0000162 ASSERT_NE(0, test_capture_signbit(-1.0f));
163 ASSERT_NE(0, test_capture_signbit(-1.0));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100164 ASSERT_NE(0, test_capture_signbit(-1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800165}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800166
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800167TEST(math, __fpclassifyd) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800168#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800169 ASSERT_EQ(FP_INFINITE, __fpclassifyd(HUGE_VAL));
170 ASSERT_EQ(FP_NAN, __fpclassifyd(nan("")));
171 ASSERT_EQ(FP_NORMAL, __fpclassifyd(1.0));
172 ASSERT_EQ(FP_SUBNORMAL, __fpclassifyd(double_subnormal()));
173 ASSERT_EQ(FP_ZERO, __fpclassifyd(0.0));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800174#else // __BIONIC__
175 GTEST_LOG_(INFO) << "This test does nothing.\n";
176#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800177}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800178
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800179TEST(math, __fpclassifyf) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800180#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800181 ASSERT_EQ(FP_INFINITE, __fpclassifyf(HUGE_VALF));
182 ASSERT_EQ(FP_NAN, __fpclassifyf(nanf("")));
183 ASSERT_EQ(FP_NORMAL, __fpclassifyf(1.0f));
184 ASSERT_EQ(FP_SUBNORMAL, __fpclassifyf(float_subnormal()));
185 ASSERT_EQ(FP_ZERO, __fpclassifyf(0.0f));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800186#else // __BIONIC__
187 GTEST_LOG_(INFO) << "This test does nothing.\n";
188#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800189}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800190
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800191TEST(math, __fpclassifyl) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800192#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800193 EXPECT_EQ(FP_INFINITE, __fpclassifyl(HUGE_VALL));
194 EXPECT_EQ(FP_NAN, __fpclassifyl(nanl("")));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100195 EXPECT_EQ(FP_NORMAL, __fpclassifyl(1.0L));
Calin Juravle4d77c112014-03-14 17:56:46 +0000196 EXPECT_EQ(FP_SUBNORMAL, __fpclassifyl(ldouble_subnormal()));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100197 EXPECT_EQ(FP_ZERO, __fpclassifyl(0.0L));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800198#else // __BIONIC__
199 GTEST_LOG_(INFO) << "This test does nothing.\n";
200#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800201}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800202
203TEST(math, finitef) {
204 ASSERT_TRUE(finitef(123.0f));
205 ASSERT_FALSE(finitef(HUGE_VALF));
206}
207
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800208TEST(math, __isfinite) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800209#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800210 ASSERT_TRUE(__isfinite(123.0));
211 ASSERT_FALSE(__isfinite(HUGE_VAL));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800212#else // __BIONIC__
213 GTEST_LOG_(INFO) << "This test does nothing.\n";
214#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800215}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800216
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800217TEST(math, __isfinitef) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800218#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800219 ASSERT_TRUE(__isfinitef(123.0f));
220 ASSERT_FALSE(__isfinitef(HUGE_VALF));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800221#else // __BIONIC__
222 GTEST_LOG_(INFO) << "This test does nothing.\n";
223#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800224}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800225
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800226TEST(math, __isfinitel) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800227#if defined(__BIONIC__)
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100228 ASSERT_TRUE(__isfinitel(123.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800229 ASSERT_FALSE(__isfinitel(HUGE_VALL));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800230#else // __BIONIC__
231 GTEST_LOG_(INFO) << "This test does nothing.\n";
232#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800233}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800234
235TEST(math, finite) {
236 ASSERT_TRUE(finite(123.0));
237 ASSERT_FALSE(finite(HUGE_VAL));
238}
239
Elliott Hughes02c78a32014-04-11 17:02:20 -0700240TEST(math, isinf_function) {
241 // The isinf macro deals with all three types; the isinf function is for doubles.
242 ASSERT_FALSE((isinf)(123.0));
243 ASSERT_TRUE((isinf)(HUGE_VAL));
244}
245
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800246TEST(math, __isinff) {
247 ASSERT_FALSE(__isinff(123.0f));
248 ASSERT_TRUE(__isinff(HUGE_VALF));
249}
250
251TEST(math, __isinfl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100252 ASSERT_FALSE(__isinfl(123.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800253 ASSERT_TRUE(__isinfl(HUGE_VALL));
254}
255
Elliott Hughes02c78a32014-04-11 17:02:20 -0700256TEST(math, isnan_function) {
257 // The isnan macro deals with all three types; the isnan function is for doubles.
258 ASSERT_FALSE((isnan)(123.0));
259 ASSERT_TRUE((isnan)(nan("")));
260}
261
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800262TEST(math, __isnanf) {
263 ASSERT_FALSE(__isnanf(123.0f));
264 ASSERT_TRUE(__isnanf(nanf("")));
265}
266
267TEST(math, __isnanl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100268 ASSERT_FALSE(__isnanl(123.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800269 ASSERT_TRUE(__isnanl(nanl("")));
270}
271
272TEST(math, isnanf) {
273 ASSERT_FALSE(isnanf(123.0f));
274 ASSERT_TRUE(isnanf(nanf("")));
275}
276
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800277TEST(math, __isnormal) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800278#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800279 ASSERT_TRUE(__isnormal(123.0));
280 ASSERT_FALSE(__isnormal(double_subnormal()));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800281#else // __BIONIC__
282 GTEST_LOG_(INFO) << "This test does nothing.\n";
283#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800284}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800285
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800286TEST(math, __isnormalf) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800287#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800288 ASSERT_TRUE(__isnormalf(123.0f));
289 ASSERT_FALSE(__isnormalf(float_subnormal()));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800290#else // __BIONIC__
291 GTEST_LOG_(INFO) << "This test does nothing.\n";
292#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800293}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800294
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800295TEST(math, __isnormall) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800296#if defined(__BIONIC__)
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100297 ASSERT_TRUE(__isnormall(123.0L));
Calin Juravle4d77c112014-03-14 17:56:46 +0000298 ASSERT_FALSE(__isnormall(ldouble_subnormal()));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800299#else // __BIONIC__
300 GTEST_LOG_(INFO) << "This test does nothing.\n";
301#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800302}
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800303
304TEST(math, __signbit) {
305 ASSERT_EQ(0, __signbit(0.0));
306 ASSERT_EQ(0, __signbit(1.0));
307 ASSERT_NE(0, __signbit(-1.0));
308}
309
310TEST(math, __signbitf) {
311 ASSERT_EQ(0, __signbitf(0.0f));
312 ASSERT_EQ(0, __signbitf(1.0f));
313 ASSERT_NE(0, __signbitf(-1.0f));
314}
315
316TEST(math, __signbitl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100317 ASSERT_EQ(0L, __signbitl(0.0L));
318 ASSERT_EQ(0L, __signbitl(1.0L));
319 ASSERT_NE(0L, __signbitl(-1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800320}
321
322TEST(math, acos) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000323 ASSERT_DOUBLE_EQ(M_PI/2.0, acos(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800324}
325
326TEST(math, acosf) {
327 ASSERT_FLOAT_EQ(static_cast<float>(M_PI)/2.0f, acosf(0.0f));
328}
329
330TEST(math, acosl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100331 ASSERT_DOUBLE_EQ(M_PI/2.0L, acosl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800332}
333
334TEST(math, asin) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000335 ASSERT_DOUBLE_EQ(0.0, asin(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800336}
337
338TEST(math, asinf) {
339 ASSERT_FLOAT_EQ(0.0f, asinf(0.0f));
340}
341
342TEST(math, asinl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100343 ASSERT_DOUBLE_EQ(0.0L, asinl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800344}
345
346TEST(math, atan) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000347 ASSERT_DOUBLE_EQ(0.0, atan(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800348}
349
350TEST(math, atanf) {
351 ASSERT_FLOAT_EQ(0.0f, atanf(0.0f));
352}
353
354TEST(math, atanl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100355 ASSERT_DOUBLE_EQ(0.0L, atanl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800356}
357
358TEST(math, atan2) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000359 ASSERT_DOUBLE_EQ(0.0, atan2(0.0, 0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800360}
361
362TEST(math, atan2f) {
363 ASSERT_FLOAT_EQ(0.0f, atan2f(0.0f, 0.0f));
364}
365
366TEST(math, atan2l) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100367 ASSERT_DOUBLE_EQ(0.0L, atan2l(0.0L, 0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800368}
369
370TEST(math, cos) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000371 ASSERT_DOUBLE_EQ(1.0, cos(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800372}
373
374TEST(math, cosf) {
375 ASSERT_FLOAT_EQ(1.0f, cosf(0.0f));
376}
377
378TEST(math, cosl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100379 ASSERT_DOUBLE_EQ(1.0L, cosl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800380}
381
382TEST(math, sin) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100383 ASSERT_DOUBLE_EQ(0.0, sin(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800384}
385
386TEST(math, sinf) {
387 ASSERT_FLOAT_EQ(0.0f, sinf(0.0f));
388}
389
390TEST(math, sinl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100391 ASSERT_DOUBLE_EQ(0.0L, sinl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800392}
393
394TEST(math, tan) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000395 ASSERT_DOUBLE_EQ(0.0, tan(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800396}
397
398TEST(math, tanf) {
399 ASSERT_FLOAT_EQ(0.0f, tanf(0.0f));
400}
401
402TEST(math, tanl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100403 ASSERT_DOUBLE_EQ(0.0L, tanl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800404}
405
406TEST(math, acosh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000407 ASSERT_DOUBLE_EQ(0.0, acosh(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800408}
409
410TEST(math, acoshf) {
411 ASSERT_FLOAT_EQ(0.0f, acoshf(1.0f));
412}
413
414TEST(math, acoshl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100415 ASSERT_DOUBLE_EQ(0.0L, acoshl(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800416}
417
418TEST(math, asinh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000419 ASSERT_DOUBLE_EQ(0.0, asinh(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800420}
421
422TEST(math, asinhf) {
423 ASSERT_FLOAT_EQ(0.0f, asinhf(0.0f));
424}
425
426TEST(math, asinhl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100427 ASSERT_DOUBLE_EQ(0.0L, asinhl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800428}
429
430TEST(math, atanh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000431 ASSERT_DOUBLE_EQ(0.0, atanh(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800432}
433
434TEST(math, atanhf) {
435 ASSERT_FLOAT_EQ(0.0f, atanhf(0.0f));
436}
437
438TEST(math, atanhl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100439 ASSERT_DOUBLE_EQ(0.0L, atanhl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800440}
441
442TEST(math, cosh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000443 ASSERT_DOUBLE_EQ(1.0, cosh(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800444}
445
446TEST(math, coshf) {
447 ASSERT_FLOAT_EQ(1.0f, coshf(0.0f));
448}
449
450TEST(math, coshl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100451 ASSERT_DOUBLE_EQ(1.0L, coshl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800452}
453
454TEST(math, sinh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000455 ASSERT_DOUBLE_EQ(0.0, sinh(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800456}
457
458TEST(math, sinhf) {
459 ASSERT_FLOAT_EQ(0.0f, sinhf(0.0f));
460}
461
462TEST(math, sinhl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100463 ASSERT_DOUBLE_EQ(0.0L, sinhl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800464}
465
466TEST(math, tanh) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000467 ASSERT_DOUBLE_EQ(0.0, tanh(0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800468}
469
470TEST(math, tanhf) {
471 ASSERT_FLOAT_EQ(0.0f, tanhf(0.0f));
472}
473
474TEST(math, tanhl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100475 ASSERT_DOUBLE_EQ(0.0L, tanhl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800476}
477
478TEST(math, log) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000479 ASSERT_DOUBLE_EQ(1.0, log(M_E));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800480}
481
482TEST(math, logf) {
483 ASSERT_FLOAT_EQ(1.0f, logf(static_cast<float>(M_E)));
484}
485
486TEST(math, logl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100487 ASSERT_DOUBLE_EQ(1.0L, logl(M_E));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800488}
489
490TEST(math, log2) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000491 ASSERT_DOUBLE_EQ(12.0, log2(4096.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800492}
493
494TEST(math, log2f) {
495 ASSERT_FLOAT_EQ(12.0f, log2f(4096.0f));
496}
497
498TEST(math, log2l) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100499 ASSERT_DOUBLE_EQ(12.0L, log2l(4096.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800500}
501
502TEST(math, log10) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000503 ASSERT_DOUBLE_EQ(3.0, log10(1000.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800504}
505
506TEST(math, log10f) {
507 ASSERT_FLOAT_EQ(3.0f, log10f(1000.0f));
508}
509
510TEST(math, log10l) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100511 ASSERT_DOUBLE_EQ(3.0L, log10l(1000.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800512}
513
514TEST(math, cbrt) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000515 ASSERT_DOUBLE_EQ(3.0, cbrt(27.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800516}
517
518TEST(math, cbrtf) {
519 ASSERT_FLOAT_EQ(3.0f, cbrtf(27.0f));
520}
521
522TEST(math, cbrtl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100523 ASSERT_DOUBLE_EQ(3.0L, cbrtl(27.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800524}
525
526TEST(math, sqrt) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000527 ASSERT_DOUBLE_EQ(2.0, sqrt(4.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800528}
529
530TEST(math, sqrtf) {
531 ASSERT_FLOAT_EQ(2.0f, sqrtf(4.0f));
532}
533
534TEST(math, sqrtl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100535 ASSERT_DOUBLE_EQ(2.0L, sqrtl(4.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800536}
537
538TEST(math, exp) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000539 ASSERT_DOUBLE_EQ(1.0, exp(0.0));
540 ASSERT_DOUBLE_EQ(M_E, exp(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800541}
542
543TEST(math, expf) {
544 ASSERT_FLOAT_EQ(1.0f, expf(0.0f));
545 ASSERT_FLOAT_EQ(static_cast<float>(M_E), expf(1.0f));
546}
547
548TEST(math, expl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100549 ASSERT_DOUBLE_EQ(1.0L, expl(0.0L));
550 ASSERT_DOUBLE_EQ(M_E, expl(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800551}
552
553TEST(math, exp2) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000554 ASSERT_DOUBLE_EQ(8.0, exp2(3.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800555}
556
557TEST(math, exp2f) {
558 ASSERT_FLOAT_EQ(8.0f, exp2f(3.0f));
559}
560
561TEST(math, exp2l) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100562 ASSERT_DOUBLE_EQ(8.0L, exp2l(3.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800563}
564
565TEST(math, expm1) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000566 ASSERT_DOUBLE_EQ(M_E - 1.0, expm1(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800567}
568
569TEST(math, expm1f) {
570 ASSERT_FLOAT_EQ(static_cast<float>(M_E) - 1.0f, expm1f(1.0f));
571}
572
573TEST(math, expm1l) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100574 ASSERT_DOUBLE_EQ(M_E - 1.0L, expm1l(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800575}
576
577TEST(math, pow) {
Elliott Hughes6a8f00d2013-11-13 13:29:23 -0800578 ASSERT_TRUE(isnan(pow(nan(""), 3.0)));
Calin Juravle4d77c112014-03-14 17:56:46 +0000579 ASSERT_DOUBLE_EQ(1.0, (pow(1.0, nan(""))));
Elliott Hughes6a8f00d2013-11-13 13:29:23 -0800580 ASSERT_TRUE(isnan(pow(2.0, nan(""))));
Calin Juravle4d77c112014-03-14 17:56:46 +0000581 ASSERT_DOUBLE_EQ(8.0, pow(2.0, 3.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800582}
583
584TEST(math, powf) {
Elliott Hughes6a8f00d2013-11-13 13:29:23 -0800585 ASSERT_TRUE(isnanf(powf(nanf(""), 3.0f)));
Narayan Kamathaf64dad2013-11-18 18:47:48 +0000586 ASSERT_FLOAT_EQ(1.0f, (powf(1.0f, nanf(""))));
Elliott Hughes6a8f00d2013-11-13 13:29:23 -0800587 ASSERT_TRUE(isnanf(powf(2.0f, nanf(""))));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800588 ASSERT_FLOAT_EQ(8.0f, powf(2.0f, 3.0f));
589}
590
591TEST(math, powl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100592 ASSERT_TRUE(__isnanl(powl(nanl(""), 3.0L)));
593 ASSERT_DOUBLE_EQ(1.0L, (powl(1.0L, nanl(""))));
594 ASSERT_TRUE(__isnanl(powl(2.0L, nanl(""))));
595 ASSERT_DOUBLE_EQ(8.0L, powl(2.0L, 3.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800596}
597
598TEST(math, ceil) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000599 ASSERT_DOUBLE_EQ(1.0, ceil(0.9));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800600}
601
602TEST(math, ceilf) {
603 ASSERT_FLOAT_EQ(1.0f, ceilf(0.9f));
604}
605
606TEST(math, ceill) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100607 ASSERT_DOUBLE_EQ(1.0L, ceill(0.9L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800608}
609
610TEST(math, floor) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000611 ASSERT_DOUBLE_EQ(1.0, floor(1.1));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800612}
613
614TEST(math, floorf) {
615 ASSERT_FLOAT_EQ(1.0f, floorf(1.1f));
616}
617
618TEST(math, floorl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100619 ASSERT_DOUBLE_EQ(1.0L, floorl(1.1L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800620}
621
622TEST(math, fabs) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000623 ASSERT_DOUBLE_EQ(1.0, fabs(-1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800624}
625
626TEST(math, fabsf) {
627 ASSERT_FLOAT_EQ(1.0f, fabsf(-1.0f));
628}
629
630TEST(math, fabsl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100631 ASSERT_DOUBLE_EQ(1.0L, fabsl(-1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800632}
633
634TEST(math, ldexp) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000635 ASSERT_DOUBLE_EQ(16.0, ldexp(2.0, 3.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800636}
637
638TEST(math, ldexpf) {
639 ASSERT_FLOAT_EQ(16.0f, ldexpf(2.0f, 3.0f));
640}
641
642TEST(math, ldexpl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100643 ASSERT_DOUBLE_EQ(16.0L, ldexpl(2.0L, 3.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800644}
645
646TEST(math, fmod) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000647 ASSERT_DOUBLE_EQ(2.0, fmod(12.0, 10.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800648}
649
650TEST(math, fmodf) {
651 ASSERT_FLOAT_EQ(2.0f, fmodf(12.0f, 10.0f));
652}
653
654TEST(math, fmodl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100655 ASSERT_DOUBLE_EQ(2.0L, fmodl(12.0L, 10.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800656}
657
658TEST(math, remainder) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000659 ASSERT_DOUBLE_EQ(2.0, remainder(12.0, 10.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800660}
661
662TEST(math, remainderf) {
663 ASSERT_FLOAT_EQ(2.0f, remainderf(12.0f, 10.0f));
664}
665
666TEST(math, remainderl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100667 ASSERT_DOUBLE_EQ(2.0L, remainderl(12.0L, 10.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800668}
669
670TEST(math, drem) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000671 ASSERT_DOUBLE_EQ(2.0, drem(12.0, 10.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800672}
673
674TEST(math, dremf) {
675 ASSERT_FLOAT_EQ(2.0f, dremf(12.0f, 10.0f));
676}
677
678TEST(math, fmax) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000679 ASSERT_DOUBLE_EQ(12.0, fmax(12.0, 10.0));
680 ASSERT_DOUBLE_EQ(12.0, fmax(12.0, nan("")));
681 ASSERT_DOUBLE_EQ(12.0, fmax(nan(""), 12.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800682}
683
684TEST(math, fmaxf) {
685 ASSERT_FLOAT_EQ(12.0f, fmaxf(12.0f, 10.0f));
686 ASSERT_FLOAT_EQ(12.0f, fmaxf(12.0f, nanf("")));
687 ASSERT_FLOAT_EQ(12.0f, fmaxf(nanf(""), 12.0f));
688}
689
690TEST(math, fmaxl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100691 ASSERT_DOUBLE_EQ(12.0L, fmaxl(12.0L, 10.0L));
692 ASSERT_DOUBLE_EQ(12.0L, fmaxl(12.0L, nanl("")));
693 ASSERT_DOUBLE_EQ(12.0L, fmaxl(nanl(""), 12.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800694}
695
696TEST(math, fmin) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000697 ASSERT_DOUBLE_EQ(10.0, fmin(12.0, 10.0));
698 ASSERT_DOUBLE_EQ(12.0, fmin(12.0, nan("")));
699 ASSERT_DOUBLE_EQ(12.0, fmin(nan(""), 12.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800700}
701
702TEST(math, fminf) {
703 ASSERT_FLOAT_EQ(10.0f, fminf(12.0f, 10.0f));
704 ASSERT_FLOAT_EQ(12.0f, fminf(12.0f, nanf("")));
705 ASSERT_FLOAT_EQ(12.0f, fminf(nanf(""), 12.0f));
706}
707
708TEST(math, fminl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100709 ASSERT_DOUBLE_EQ(10.0L, fminl(12.0L, 10.0L));
710 ASSERT_DOUBLE_EQ(12.0L, fminl(12.0L, nanl("")));
711 ASSERT_DOUBLE_EQ(12.0L, fminl(nanl(""), 12.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800712}
713
714TEST(math, fma) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000715 ASSERT_DOUBLE_EQ(10.0, fma(2.0, 3.0, 4.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800716}
717
718TEST(math, fmaf) {
719 ASSERT_FLOAT_EQ(10.0f, fmaf(2.0f, 3.0f, 4.0f));
720}
721
722TEST(math, fmal) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100723 ASSERT_DOUBLE_EQ(10.0L, fmal(2.0L, 3.0L, 4.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800724}
725
726TEST(math, hypot) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000727 ASSERT_DOUBLE_EQ(5.0, hypot(3.0, 4.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800728}
729
730TEST(math, hypotf) {
731 ASSERT_FLOAT_EQ(5.0f, hypotf(3.0f, 4.0f));
732}
733
734TEST(math, hypotl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100735 ASSERT_DOUBLE_EQ(5.0L, hypotl(3.0L, 4.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800736}
737
738TEST(math, erf) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000739 ASSERT_DOUBLE_EQ(0.84270079294971489, erf(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800740}
741
742TEST(math, erff) {
743 ASSERT_FLOAT_EQ(0.84270078f, erff(1.0f));
744}
745
746TEST(math, erfl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100747 ASSERT_DOUBLE_EQ(0.84270079294971489L, erfl(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800748}
749
750TEST(math, erfc) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000751 ASSERT_DOUBLE_EQ(0.15729920705028513, erfc(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800752}
753
754TEST(math, erfcf) {
755 ASSERT_FLOAT_EQ(0.15729921f, erfcf(1.0f));
756}
757
758TEST(math, erfcl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100759 ASSERT_DOUBLE_EQ(0.15729920705028513l, erfcl(1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800760}
761
762TEST(math, lrint) {
763 fesetround(FE_UPWARD); // lrint/lrintf/lrintl obey the rounding mode.
764 ASSERT_EQ(1235, lrint(1234.01));
765 ASSERT_EQ(1235, lrintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100766 ASSERT_EQ(1235, lrintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800767 fesetround(FE_TOWARDZERO); // lrint/lrintf/lrintl obey the rounding mode.
768 ASSERT_EQ(1234, lrint(1234.01));
769 ASSERT_EQ(1234, lrintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100770 ASSERT_EQ(1234, lrintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800771
772 fesetround(FE_UPWARD); // llrint/llrintf/llrintl obey the rounding mode.
773 ASSERT_EQ(1235L, llrint(1234.01));
774 ASSERT_EQ(1235L, llrintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100775 ASSERT_EQ(1235L, llrintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800776 fesetround(FE_TOWARDZERO); // llrint/llrintf/llrintl obey the rounding mode.
777 ASSERT_EQ(1234L, llrint(1234.01));
778 ASSERT_EQ(1234L, llrintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100779 ASSERT_EQ(1234L, llrintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800780}
781
782TEST(math, rint) {
783 fesetround(FE_UPWARD); // rint/rintf/rintl obey the rounding mode.
784 feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
785 ASSERT_EQ(1234.0, rint(1234.0));
786 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
787 ASSERT_EQ(1235.0, rint(1234.01));
788 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) != 0);
789
790 feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
791 ASSERT_EQ(1234.0f, rintf(1234.0f));
792 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
793 ASSERT_EQ(1235.0f, rintf(1234.01f));
794 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) != 0);
795
796 feclearexcept(FE_ALL_EXCEPT); // rint/rintf/rintl do set the FE_INEXACT flag.
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100797 ASSERT_EQ(1234.0, rintl(1234.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800798 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100799 ASSERT_EQ(1235.0, rintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800800 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) != 0);
801
802 fesetround(FE_TOWARDZERO); // rint/rintf obey the rounding mode.
803 ASSERT_EQ(1234.0, rint(1234.01));
804 ASSERT_EQ(1234.0f, rintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100805 ASSERT_EQ(1234.0, rintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800806}
807
808TEST(math, nearbyint) {
809 fesetround(FE_UPWARD); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
810 feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
811 ASSERT_EQ(1234.0, nearbyint(1234.0));
812 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
813 ASSERT_EQ(1235.0, nearbyint(1234.01));
814 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
815
816 feclearexcept(FE_ALL_EXCEPT);
817 ASSERT_EQ(1234.0f, nearbyintf(1234.0f));
818 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
819 ASSERT_EQ(1235.0f, nearbyintf(1234.01f));
820 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
821
822 feclearexcept(FE_ALL_EXCEPT); // nearbyint/nearbyintf/nearbyintl don't set the FE_INEXACT flag.
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100823 ASSERT_EQ(1234.0, nearbyintl(1234.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800824 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100825 ASSERT_EQ(1235.0, nearbyintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800826 ASSERT_TRUE((fetestexcept(FE_ALL_EXCEPT) & FE_INEXACT) == 0);
827
828 fesetround(FE_TOWARDZERO); // nearbyint/nearbyintf/nearbyintl obey the rounding mode.
829 ASSERT_EQ(1234.0, nearbyint(1234.01));
830 ASSERT_EQ(1234.0f, nearbyintf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100831 ASSERT_EQ(1234.0, nearbyintl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800832}
833
834TEST(math, lround) {
835 fesetround(FE_UPWARD); // lround ignores the rounding mode.
836 ASSERT_EQ(1234, lround(1234.01));
837 ASSERT_EQ(1234, lroundf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100838 ASSERT_EQ(1234, lroundl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800839}
840
841TEST(math, llround) {
842 fesetround(FE_UPWARD); // llround ignores the rounding mode.
843 ASSERT_EQ(1234L, llround(1234.01));
844 ASSERT_EQ(1234L, llroundf(1234.01f));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100845 ASSERT_EQ(1234L, llroundl(1234.01L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800846}
847
848TEST(math, ilogb) {
849 ASSERT_EQ(FP_ILOGB0, ilogb(0.0));
850 ASSERT_EQ(FP_ILOGBNAN, ilogb(nan("")));
851 ASSERT_EQ(INT_MAX, ilogb(HUGE_VAL));
852 ASSERT_EQ(0, ilogb(1.0));
853 ASSERT_EQ(3, ilogb(10.0));
854}
855
856TEST(math, ilogbf) {
857 ASSERT_EQ(FP_ILOGB0, ilogbf(0.0f));
858 ASSERT_EQ(FP_ILOGBNAN, ilogbf(nanf("")));
859 ASSERT_EQ(INT_MAX, ilogbf(HUGE_VALF));
860 ASSERT_EQ(0, ilogbf(1.0f));
861 ASSERT_EQ(3, ilogbf(10.0f));
862}
863
864TEST(math, ilogbl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100865 ASSERT_EQ(FP_ILOGB0, ilogbl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800866 ASSERT_EQ(FP_ILOGBNAN, ilogbl(nanl("")));
867 ASSERT_EQ(INT_MAX, ilogbl(HUGE_VALL));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100868 ASSERT_EQ(0L, ilogbl(1.0L));
869 ASSERT_EQ(3L, ilogbl(10.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800870}
871
872TEST(math, logb) {
873 ASSERT_EQ(-HUGE_VAL, logb(0.0));
874 ASSERT_TRUE(isnan(logb(nan(""))));
875 ASSERT_TRUE(isinf(logb(HUGE_VAL)));
876 ASSERT_EQ(0.0, logb(1.0));
877 ASSERT_EQ(3.0, logb(10.0));
878}
879
880TEST(math, logbf) {
881 ASSERT_EQ(-HUGE_VALF, logbf(0.0f));
882 ASSERT_TRUE(isnanf(logbf(nanf(""))));
883 ASSERT_TRUE(__isinff(logbf(HUGE_VALF)));
884 ASSERT_EQ(0.0f, logbf(1.0f));
885 ASSERT_EQ(3.0f, logbf(10.0f));
886}
887
888TEST(math, logbl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100889 ASSERT_EQ(-HUGE_VAL, logbl(0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800890 ASSERT_TRUE(isnan(logbl(nanl(""))));
891 ASSERT_TRUE(isinf(logbl(HUGE_VALL)));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100892 ASSERT_EQ(0.0L, logbl(1.0L));
893 ASSERT_EQ(3.0L, logbl(10.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800894}
895
896TEST(math, log1p) {
897 ASSERT_EQ(-HUGE_VAL, log1p(-1.0));
898 ASSERT_TRUE(isnan(log1p(nan(""))));
899 ASSERT_TRUE(isinf(log1p(HUGE_VAL)));
Calin Juravle4d77c112014-03-14 17:56:46 +0000900 ASSERT_DOUBLE_EQ(1.0, log1p(M_E - 1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800901}
902
903TEST(math, log1pf) {
904 ASSERT_EQ(-HUGE_VALF, log1pf(-1.0f));
905 ASSERT_TRUE(isnanf(log1pf(nanf(""))));
906 ASSERT_TRUE(__isinff(log1pf(HUGE_VALF)));
907 ASSERT_FLOAT_EQ(1.0f, log1pf(static_cast<float>(M_E) - 1.0f));
908}
909
910TEST(math, log1pl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100911 ASSERT_EQ(-HUGE_VALL, log1pl(-1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800912 ASSERT_TRUE(isnan(log1pl(nanl(""))));
913 ASSERT_TRUE(isinf(log1pl(HUGE_VALL)));
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100914 ASSERT_DOUBLE_EQ(1.0L, log1pl(M_E - 1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800915}
916
917TEST(math, fdim) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000918 ASSERT_DOUBLE_EQ(0.0, fdim(1.0, 1.0));
919 ASSERT_DOUBLE_EQ(1.0, fdim(2.0, 1.0));
920 ASSERT_DOUBLE_EQ(0.0, fdim(1.0, 2.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800921}
922
923TEST(math, fdimf) {
924 ASSERT_FLOAT_EQ(0.0f, fdimf(1.0f, 1.0f));
925 ASSERT_FLOAT_EQ(1.0f, fdimf(2.0f, 1.0f));
926 ASSERT_FLOAT_EQ(0.0f, fdimf(1.0f, 2.0f));
927}
928
929TEST(math, fdiml) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100930 ASSERT_DOUBLE_EQ(0.0L, fdiml(1.0L, 1.0L));
931 ASSERT_DOUBLE_EQ(1.0L, fdiml(2.0L, 1.0L));
932 ASSERT_DOUBLE_EQ(0.0L, fdiml(1.0L, 2.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800933}
934
935TEST(math, round) {
936 fesetround(FE_TOWARDZERO); // round ignores the rounding mode and always rounds away from zero.
Calin Juravle4d77c112014-03-14 17:56:46 +0000937 ASSERT_DOUBLE_EQ(1.0, round(0.5));
938 ASSERT_DOUBLE_EQ(-1.0, round(-0.5));
939 ASSERT_DOUBLE_EQ(0.0, round(0.0));
940 ASSERT_DOUBLE_EQ(-0.0, round(-0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800941 ASSERT_TRUE(isnan(round(nan(""))));
Calin Juravle4d77c112014-03-14 17:56:46 +0000942 ASSERT_DOUBLE_EQ(HUGE_VAL, round(HUGE_VAL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800943}
944
945TEST(math, roundf) {
946 fesetround(FE_TOWARDZERO); // roundf ignores the rounding mode and always rounds away from zero.
947 ASSERT_FLOAT_EQ(1.0f, roundf(0.5f));
948 ASSERT_FLOAT_EQ(-1.0f, roundf(-0.5f));
949 ASSERT_FLOAT_EQ(0.0f, roundf(0.0f));
950 ASSERT_FLOAT_EQ(-0.0f, roundf(-0.0f));
951 ASSERT_TRUE(isnanf(roundf(nanf(""))));
952 ASSERT_FLOAT_EQ(HUGE_VALF, roundf(HUGE_VALF));
953}
954
955TEST(math, roundl) {
956 fesetround(FE_TOWARDZERO); // roundl ignores the rounding mode and always rounds away from zero.
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100957 ASSERT_DOUBLE_EQ(1.0L, roundl(0.5L));
958 ASSERT_DOUBLE_EQ(-1.0L, roundl(-0.5L));
959 ASSERT_DOUBLE_EQ(0.0L, roundl(0.0L));
960 ASSERT_DOUBLE_EQ(-0.0L, roundl(-0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800961 ASSERT_TRUE(isnan(roundl(nanl(""))));
Calin Juravle4d77c112014-03-14 17:56:46 +0000962 ASSERT_DOUBLE_EQ(HUGE_VALL, roundl(HUGE_VALL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800963}
964
965TEST(math, trunc) {
966 fesetround(FE_UPWARD); // trunc ignores the rounding mode and always rounds toward zero.
Calin Juravle4d77c112014-03-14 17:56:46 +0000967 ASSERT_DOUBLE_EQ(1.0, trunc(1.5));
968 ASSERT_DOUBLE_EQ(-1.0, trunc(-1.5));
969 ASSERT_DOUBLE_EQ(0.0, trunc(0.0));
970 ASSERT_DOUBLE_EQ(-0.0, trunc(-0.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800971 ASSERT_TRUE(isnan(trunc(nan(""))));
Calin Juravle4d77c112014-03-14 17:56:46 +0000972 ASSERT_DOUBLE_EQ(HUGE_VAL, trunc(HUGE_VAL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800973}
974
975TEST(math, truncf) {
976 fesetround(FE_UPWARD); // truncf ignores the rounding mode and always rounds toward zero.
977 ASSERT_FLOAT_EQ(1.0f, truncf(1.5f));
978 ASSERT_FLOAT_EQ(-1.0f, truncf(-1.5f));
979 ASSERT_FLOAT_EQ(0.0f, truncf(0.0f));
980 ASSERT_FLOAT_EQ(-0.0f, truncf(-0.0f));
981 ASSERT_TRUE(isnan(truncf(nanf(""))));
982 ASSERT_FLOAT_EQ(HUGE_VALF, truncf(HUGE_VALF));
983}
984
985TEST(math, truncl) {
986 fesetround(FE_UPWARD); // truncl ignores the rounding mode and always rounds toward zero.
Calin Juravleb7afa9d2014-04-01 16:41:12 +0100987 ASSERT_DOUBLE_EQ(1.0L, truncl(1.5L));
988 ASSERT_DOUBLE_EQ(-1.0L, truncl(-1.5L));
989 ASSERT_DOUBLE_EQ(0.0L, truncl(0.0L));
990 ASSERT_DOUBLE_EQ(-0.0L, truncl(-0.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800991 ASSERT_TRUE(isnan(truncl(nan(""))));
Calin Juravle4d77c112014-03-14 17:56:46 +0000992 ASSERT_DOUBLE_EQ(HUGE_VALL, truncl(HUGE_VALL));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800993}
994
995TEST(math, nextafter) {
Calin Juravle4d77c112014-03-14 17:56:46 +0000996 ASSERT_DOUBLE_EQ(0.0, nextafter(0.0, 0.0));
997 ASSERT_DOUBLE_EQ(4.9406564584124654e-324, nextafter(0.0, 1.0));
998 ASSERT_DOUBLE_EQ(0.0, nextafter(0.0, -1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -0800999}
1000
1001TEST(math, nextafterf) {
1002 ASSERT_FLOAT_EQ(0.0f, nextafterf(0.0f, 0.0f));
1003 ASSERT_FLOAT_EQ(1.4012985e-45f, nextafterf(0.0f, 1.0f));
1004 ASSERT_FLOAT_EQ(0.0f, nextafterf(0.0f, -1.0f));
1005}
1006
1007TEST(math, nextafterl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001008 ASSERT_DOUBLE_EQ(0.0L, nextafterl(0.0L, 0.0L));
Calin Juravle4d77c112014-03-14 17:56:46 +00001009 // Use a runtime value to accomodate the case when
1010 // sizeof(double) == sizeof(long double)
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001011 long double smallest_positive = ldexpl(1.0L, LDBL_MIN_EXP - LDBL_MANT_DIG);
1012 ASSERT_DOUBLE_EQ(smallest_positive, nextafterl(0.0L, 1.0L));
1013 ASSERT_DOUBLE_EQ(0.0L, nextafterl(0.0L, -1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001014}
1015
Calin Juravle1abc9ff2014-04-17 18:17:32 +01001016TEST(math, nexttoward) {
1017 ASSERT_DOUBLE_EQ(0.0, nexttoward(0.0, 0.0L));
1018 ASSERT_DOUBLE_EQ(4.9406564584124654e-324, nexttoward(0.0, 1.0L));
1019 ASSERT_DOUBLE_EQ(0.0, nexttoward(0.0, -1.0L));
1020}
1021
1022TEST(math, nexttowardf) {
1023 ASSERT_FLOAT_EQ(0.0f, nexttowardf(0.0f, 0.0L));
1024 ASSERT_FLOAT_EQ(1.4012985e-45f, nexttowardf(0.0f, 1.0L));
1025 ASSERT_FLOAT_EQ(0.0f, nexttowardf(0.0f, -1.0L));
1026}
1027
1028TEST(math, nexttowardl) {
1029 ASSERT_DOUBLE_EQ(0.0L, nexttowardl(0.0L, 0.0L));
1030 // Use a runtime value to accomodate the case when
1031 // sizeof(double) == sizeof(long double)
1032 long double smallest_positive = ldexpl(1.0L, LDBL_MIN_EXP - LDBL_MANT_DIG);
1033 ASSERT_DOUBLE_EQ(smallest_positive, nexttowardl(0.0L, 1.0L));
1034 ASSERT_DOUBLE_EQ(0.0L, nexttowardl(0.0L, -1.0L));
1035}
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001036
1037TEST(math, copysign) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001038 ASSERT_DOUBLE_EQ(0.0, copysign(0.0, 1.0));
1039 ASSERT_DOUBLE_EQ(-0.0, copysign(0.0, -1.0));
1040 ASSERT_DOUBLE_EQ(2.0, copysign(2.0, 1.0));
1041 ASSERT_DOUBLE_EQ(-2.0, copysign(2.0, -1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001042}
1043
1044TEST(math, copysignf) {
1045 ASSERT_FLOAT_EQ(0.0f, copysignf(0.0f, 1.0f));
1046 ASSERT_FLOAT_EQ(-0.0f, copysignf(0.0f, -1.0f));
1047 ASSERT_FLOAT_EQ(2.0f, copysignf(2.0f, 1.0f));
1048 ASSERT_FLOAT_EQ(-2.0f, copysignf(2.0f, -1.0f));
1049}
1050
1051TEST(math, copysignl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001052 ASSERT_DOUBLE_EQ(0.0L, copysignl(0.0L, 1.0L));
1053 ASSERT_DOUBLE_EQ(-0.0L, copysignl(0.0L, -1.0L));
1054 ASSERT_DOUBLE_EQ(2.0L, copysignl(2.0L, 1.0L));
1055 ASSERT_DOUBLE_EQ(-2.0L, copysignl(2.0L, -1.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001056}
1057
1058TEST(math, significand) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001059 ASSERT_DOUBLE_EQ(0.0, significand(0.0));
1060 ASSERT_DOUBLE_EQ(1.2, significand(1.2));
1061 ASSERT_DOUBLE_EQ(1.5375, significand(12.3));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001062}
1063
1064TEST(math, significandf) {
1065 ASSERT_FLOAT_EQ(0.0f, significandf(0.0f));
1066 ASSERT_FLOAT_EQ(1.2f, significandf(1.2f));
1067 ASSERT_FLOAT_EQ(1.5375f, significandf(12.3f));
1068}
1069
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001070TEST(math, significandl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001071 ASSERT_DOUBLE_EQ(0.0L, significandl(0.0L));
1072 ASSERT_DOUBLE_EQ(1.2L, significandl(1.2L));
1073 ASSERT_DOUBLE_EQ(1.5375L, significandl(12.3L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001074}
1075
1076TEST(math, scalb) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001077 ASSERT_DOUBLE_EQ(12.0, scalb(3.0, 2.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001078}
1079
1080TEST(math, scalbf) {
1081 ASSERT_FLOAT_EQ(12.0f, scalbf(3.0f, 2.0f));
1082}
1083
1084TEST(math, scalbln) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001085 ASSERT_DOUBLE_EQ(12.0, scalbln(3.0, 2L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001086}
1087
1088TEST(math, scalblnf) {
1089 ASSERT_FLOAT_EQ(12.0f, scalblnf(3.0f, 2L));
1090}
1091
1092TEST(math, scalblnl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001093 ASSERT_DOUBLE_EQ(12.0L, scalblnl(3.0L, 2L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001094}
1095
1096TEST(math, scalbn) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001097 ASSERT_DOUBLE_EQ(12.0, scalbn(3.0, 2));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001098}
1099
1100TEST(math, scalbnf) {
1101 ASSERT_FLOAT_EQ(12.0f, scalbnf(3.0f, 2));
1102}
1103
1104TEST(math, scalbnl) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001105 ASSERT_DOUBLE_EQ(12.0L, scalbnl(3.0L, 2));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001106}
1107
1108TEST(math, gamma) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001109 ASSERT_DOUBLE_EQ(log(24.0), gamma(5.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001110}
1111
1112TEST(math, gammaf) {
1113 ASSERT_FLOAT_EQ(logf(24.0f), gammaf(5.0f));
1114}
1115
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001116TEST(math, gamma_r) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -08001117#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001118 int sign;
Calin Juravle4d77c112014-03-14 17:56:46 +00001119 ASSERT_DOUBLE_EQ(log(24.0), gamma_r(5.0, &sign));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001120 ASSERT_EQ(1, sign);
Christopher Ferrisf04935c2013-12-20 18:43:21 -08001121#else // __BIONIC__
1122 GTEST_LOG_(INFO) << "This test does nothing.\n";
1123#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001124}
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001125
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001126TEST(math, gammaf_r) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -08001127#if defined(__BIONIC__)
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001128 int sign;
1129 ASSERT_FLOAT_EQ(logf(24.0f), gammaf_r(5.0f, &sign));
1130 ASSERT_EQ(1, sign);
Christopher Ferrisf04935c2013-12-20 18:43:21 -08001131#else // __BIONIC__
1132 GTEST_LOG_(INFO) << "This test does nothing.\n";
1133#endif // __BIONIC__
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001134}
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001135
1136TEST(math, lgamma) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001137 ASSERT_DOUBLE_EQ(log(24.0), lgamma(5.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001138}
1139
1140TEST(math, lgammaf) {
1141 ASSERT_FLOAT_EQ(logf(24.0f), lgammaf(5.0f));
1142}
1143
1144TEST(math, lgammal) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001145 ASSERT_DOUBLE_EQ(logl(24.0L), lgammal(5.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001146}
1147
1148TEST(math, lgamma_r) {
1149 int sign;
Calin Juravle4d77c112014-03-14 17:56:46 +00001150 ASSERT_DOUBLE_EQ(log(24.0), lgamma_r(5.0, &sign));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001151 ASSERT_EQ(1, sign);
1152}
1153
1154TEST(math, lgammaf_r) {
1155 int sign;
1156 ASSERT_FLOAT_EQ(logf(24.0f), lgammaf_r(5.0f, &sign));
1157 ASSERT_EQ(1, sign);
1158}
1159
1160TEST(math, tgamma) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001161 ASSERT_DOUBLE_EQ(24.0, tgamma(5.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001162}
1163
1164TEST(math, tgammaf) {
1165 ASSERT_FLOAT_EQ(24.0f, tgammaf(5.0f));
1166}
1167
1168TEST(math, tgammal) {
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001169 ASSERT_DOUBLE_EQ(24.0L, tgammal(5.0L));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001170}
1171
1172TEST(math, j0) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001173 ASSERT_DOUBLE_EQ(1.0, j0(0.0));
1174 ASSERT_DOUBLE_EQ(0.76519768655796661, j0(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001175}
1176
1177TEST(math, j0f) {
1178 ASSERT_FLOAT_EQ(1.0f, j0f(0.0f));
1179 ASSERT_FLOAT_EQ(0.76519769f, j0f(1.0f));
1180}
1181
1182TEST(math, j1) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001183 ASSERT_DOUBLE_EQ(0.0, j1(0.0));
1184 ASSERT_DOUBLE_EQ(0.44005058574493355, j1(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001185}
1186
1187TEST(math, j1f) {
1188 ASSERT_FLOAT_EQ(0.0f, j1f(0.0f));
1189 ASSERT_FLOAT_EQ(0.44005057f, j1f(1.0f));
1190}
1191
1192TEST(math, jn) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001193 ASSERT_DOUBLE_EQ(0.0, jn(4, 0.0));
1194 ASSERT_DOUBLE_EQ(0.0024766389641099553, jn(4, 1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001195}
1196
1197TEST(math, jnf) {
1198 ASSERT_FLOAT_EQ(0.0f, jnf(4, 0.0f));
1199 ASSERT_FLOAT_EQ(0.0024766389f, jnf(4, 1.0f));
1200}
1201
1202TEST(math, y0) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001203 ASSERT_DOUBLE_EQ(-HUGE_VAL, y0(0.0));
1204 ASSERT_DOUBLE_EQ(0.08825696421567697, y0(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001205}
1206
1207TEST(math, y0f) {
1208 ASSERT_FLOAT_EQ(-HUGE_VALF, y0f(0.0f));
1209 ASSERT_FLOAT_EQ(0.088256963f, y0f(1.0f));
1210}
1211
1212TEST(math, y1) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001213 ASSERT_DOUBLE_EQ(-HUGE_VAL, y1(0.0));
1214 ASSERT_DOUBLE_EQ(-0.78121282130028868, y1(1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001215}
1216
1217TEST(math, y1f) {
1218 ASSERT_FLOAT_EQ(-HUGE_VALF, y1f(0.0f));
1219 ASSERT_FLOAT_EQ(-0.78121281f, y1f(1.0f));
1220}
1221
1222TEST(math, yn) {
Calin Juravle4d77c112014-03-14 17:56:46 +00001223 ASSERT_DOUBLE_EQ(-HUGE_VAL, yn(4, 0.0));
1224 ASSERT_DOUBLE_EQ(-33.278423028972114, yn(4, 1.0));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001225}
1226
1227TEST(math, ynf) {
1228 ASSERT_FLOAT_EQ(-HUGE_VALF, ynf(4, 0.0f));
1229 ASSERT_FLOAT_EQ(-33.278423f, ynf(4, 1.0f));
1230}
1231
1232TEST(math, frexp) {
1233 int exp;
1234 double dr = frexp(1024.0, &exp);
Calin Juravle4d77c112014-03-14 17:56:46 +00001235 ASSERT_DOUBLE_EQ(1024.0, scalbn(dr, exp));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001236}
1237
1238TEST(math, frexpf) {
1239 int exp;
1240 float fr = frexpf(1024.0f, &exp);
1241 ASSERT_FLOAT_EQ(1024.0f, scalbnf(fr, exp));
1242}
1243
1244TEST(math, frexpl) {
1245 int exp;
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001246 long double ldr = frexpl(1024.0L, &exp);
1247 ASSERT_DOUBLE_EQ(1024.0L, scalbnl(ldr, exp));
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001248}
1249
1250TEST(math, modf) {
1251 double di;
Calin Juravled8d6fee2014-04-01 16:45:53 +01001252 double df = modf(123.75, &di);
Calin Juravle4d77c112014-03-14 17:56:46 +00001253 ASSERT_DOUBLE_EQ(123.0, di);
Calin Juravled8d6fee2014-04-01 16:45:53 +01001254 ASSERT_DOUBLE_EQ(0.75, df);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001255}
1256
1257TEST(math, modff) {
1258 float fi;
Calin Juravled8d6fee2014-04-01 16:45:53 +01001259 float ff = modff(123.75f, &fi);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001260 ASSERT_FLOAT_EQ(123.0f, fi);
Calin Juravled8d6fee2014-04-01 16:45:53 +01001261 ASSERT_FLOAT_EQ(0.75f, ff);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001262}
1263
1264TEST(math, modfl) {
1265 long double ldi;
Calin Juravled8d6fee2014-04-01 16:45:53 +01001266 long double ldf = modfl(123.75L, &ldi);
1267 ASSERT_DOUBLE_EQ(123.0L, ldi);
1268 ASSERT_DOUBLE_EQ(0.75L, ldf);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001269}
1270
1271TEST(math, remquo) {
1272 int q;
1273 double d = remquo(13.0, 4.0, &q);
1274 ASSERT_EQ(3, q);
Calin Juravle4d77c112014-03-14 17:56:46 +00001275 ASSERT_DOUBLE_EQ(1.0, d);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001276}
1277
1278TEST(math, remquof) {
1279 int q;
1280 float f = remquof(13.0f, 4.0f, &q);
1281 ASSERT_EQ(3, q);
1282 ASSERT_FLOAT_EQ(1.0, f);
1283}
1284
1285TEST(math, remquol) {
1286 int q;
Calin Juravleb7afa9d2014-04-01 16:41:12 +01001287 long double ld = remquol(13.0L, 4.0L, &q);
1288 ASSERT_DOUBLE_EQ(3L, q);
1289 ASSERT_DOUBLE_EQ(1.0L, ld);
Elliott Hughesa0ee0782013-01-30 19:06:37 -08001290}
1291
1292// https://code.google.com/p/android/issues/detail?id=6697
1293TEST(math, frexpf_public_bug_6697) {
1294 int exp;
1295 float fr = frexpf(14.1f, &exp);
1296 ASSERT_FLOAT_EQ(14.1f, scalbnf(fr, exp));
1297}
Elliott Hughes18b17e92014-06-06 21:43:33 -07001298
1299TEST(math, exp2_STRICT_ALIGN_OpenBSD_bug) {
1300 // OpenBSD/x86's libm had a bug here, but it was already fixed in FreeBSD:
1301 // http://svnweb.FreeBSD.org/base/head/lib/msun/src/math_private.h?revision=240827&view=markup
1302 ASSERT_DOUBLE_EQ(5.0, exp2(log2(5)));
1303 ASSERT_FLOAT_EQ(5.0f, exp2f(log2f(5)));
1304 ASSERT_DOUBLE_EQ(5.0L, exp2l(log2l(5)));
1305}
1306
1307TEST(math, nextafterl_OpenBSD_bug) {
1308 // OpenBSD/x86's libm had a bug here.
1309 ASSERT_TRUE(nextafter(1.0, 0.0) - 1.0 < 0.0);
1310 ASSERT_TRUE(nextafterf(1.0f, 0.0f) - 1.0f < 0.0f);
1311 ASSERT_TRUE(nextafterl(1.0L, 0.0L) - 1.0L < 0.0L);
1312}