1//===-- Unittests for atan2 -----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "src/math/atan2.h"
10#include "test/UnitTest/FPMatcher.h"
11#include "test/UnitTest/Test.h"
12
13using LlvmLibcAtan2Test = LIBC_NAMESPACE::testing::FPTest<double>;
14
15TEST_F(LlvmLibcAtan2Test, SpecialNumbers) {
16 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(sNaN, sNaN),
17 FE_INVALID);
18 EXPECT_MATH_ERRNO(0);
19
20 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(sNaN, 1.0),
21 FE_INVALID);
22 EXPECT_MATH_ERRNO(0);
23
24 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(1.0, sNaN),
25 FE_INVALID);
26 EXPECT_MATH_ERRNO(0);
27
28 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2(aNaN, zero));
29 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2(1.0, aNaN));
30 EXPECT_FP_EQ_ALL_ROUNDING(0.0, LIBC_NAMESPACE::atan2(zero, zero));
31 EXPECT_FP_EQ_ALL_ROUNDING(-0.0, LIBC_NAMESPACE::atan2(-0.0, zero));
32 EXPECT_FP_EQ_ALL_ROUNDING(0.0, LIBC_NAMESPACE::atan2(1.0, inf));
33 EXPECT_FP_EQ_ALL_ROUNDING(-0.0, LIBC_NAMESPACE::atan2(-1.0, inf));
34}
35
36#ifdef LIBC_TEST_FTZ_DAZ
37
38using namespace LIBC_NAMESPACE::testing;
39
40TEST_F(LlvmLibcAtan2Test, FTZMode) {
41 ModifyMXCSR mxcsr(FTZ);
42
43 EXPECT_FP_EQ(0x1.921fb54442d18p-1,
44 LIBC_NAMESPACE::atan2(min_denormal, min_denormal));
45 EXPECT_FP_EQ(0x1.0000000000001p-52,
46 LIBC_NAMESPACE::atan2(min_denormal, max_denormal));
47 EXPECT_FP_EQ(0x1.921fb54442d17p0,
48 LIBC_NAMESPACE::atan2(max_denormal, min_denormal));
49 EXPECT_FP_EQ(0x1.921fb54442d18p-1,
50 LIBC_NAMESPACE::atan2(max_denormal, max_denormal));
51}
52
53TEST_F(LlvmLibcAtan2Test, DAZMode) {
54 ModifyMXCSR mxcsr(DAZ);
55
56 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(min_denormal, min_denormal));
57 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(min_denormal, max_denormal));
58 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(max_denormal, min_denormal));
59 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(max_denormal, max_denormal));
60}
61
62TEST_F(LlvmLibcAtan2Test, FTZDAZMode) {
63 ModifyMXCSR mxcsr(FTZ | DAZ);
64
65 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(min_denormal, min_denormal));
66 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(min_denormal, max_denormal));
67 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(max_denormal, min_denormal));
68 EXPECT_FP_EQ(0.0, LIBC_NAMESPACE::atan2(max_denormal, max_denormal));
69}
70
71#endif
72

source code of libc/test/src/math/smoke/atan2_test.cpp