1//===-- Unittests for atan2f ----------------------------------------------===//
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 "hdr/math_macros.h"
10#include "src/__support/FPUtil/FPBits.h"
11#include "src/__support/libc_errno.h"
12#include "src/math/atan2f.h"
13#include "test/UnitTest/FPMatcher.h"
14#include "test/UnitTest/Test.h"
15
16using LlvmLibcAtan2fTest = LIBC_NAMESPACE::testing::FPTest<float>;
17
18TEST_F(LlvmLibcAtan2fTest, SpecialNumbers) {
19 libc_errno = 0;
20
21 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, sNaN),
22 FE_INVALID);
23 EXPECT_MATH_ERRNO(0);
24
25 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, 1.0f),
26 FE_INVALID);
27 EXPECT_MATH_ERRNO(0);
28
29 EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(1.0f, sNaN),
30 FE_INVALID);
31 EXPECT_MATH_ERRNO(0);
32
33 // TODO: Strengthen errno,exception checks and remove these assert macros
34 // after new matchers/test fixtures are added see:
35 // https://github.com/llvm/llvm-project/issues/90653.
36 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
37 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(aNaN, zero));
38 // TODO: Uncomment these checks later, RoundingMode affects running
39 // tests in this way https://github.com/llvm/llvm-project/issues/90653.
40 // EXPECT_FP_EXCEPTION(0);
41 EXPECT_MATH_ERRNO(0);
42
43 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
44 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(1.0f, aNaN));
45 // See above TODO
46 // EXPECT_FP_EXCEPTION(0);
47 EXPECT_MATH_ERRNO(0);
48
49 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
50 EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atan2f(zero, zero));
51 // See above TODO
52 // EXPECT_FP_EXCEPTION(0);
53 EXPECT_MATH_ERRNO(0);
54
55 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
56 EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atan2f(-0.0f, zero));
57 // See above TODO
58 // EXPECT_FP_EXCEPTION(0);
59 EXPECT_MATH_ERRNO(0);
60
61 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
62 EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atan2f(1.0f, inf));
63 // See above TODO
64 // EXPECT_FP_EXCEPTION(0);
65 EXPECT_MATH_ERRNO(0);
66
67 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT);
68 EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atan2f(-1.0f, inf));
69 // See above TODO
70 // EXPECT_FP_EXCEPTION(0);
71 EXPECT_MATH_ERRNO(0);
72}
73
74#ifdef LIBC_TEST_FTZ_DAZ
75
76using namespace LIBC_NAMESPACE::testing;
77
78TEST_F(LlvmLibcAtan2fTest, FTZMode) {
79 ModifyMXCSR mxcsr(FTZ);
80
81 EXPECT_FP_EQ(0x1.921fb6p-1f,
82 LIBC_NAMESPACE::atan2f(min_denormal, min_denormal));
83 EXPECT_FP_EQ(0x1.000002p-23f,
84 LIBC_NAMESPACE::atan2f(min_denormal, max_denormal));
85 EXPECT_FP_EQ(0x1.921fb4p0f,
86 LIBC_NAMESPACE::atan2f(max_denormal, min_denormal));
87 EXPECT_FP_EQ(0x1.921fb6p-1f,
88 LIBC_NAMESPACE::atan2f(max_denormal, max_denormal));
89}
90
91TEST_F(LlvmLibcAtan2fTest, DAZMode) {
92 ModifyMXCSR mxcsr(DAZ);
93
94 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal));
95 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal));
96 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal));
97 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal));
98}
99
100TEST_F(LlvmLibcAtan2fTest, FTZDAZMode) {
101 ModifyMXCSR mxcsr(FTZ | DAZ);
102
103 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal));
104 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal));
105 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal));
106 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal));
107}
108
109#endif
110

Provided by KDAB

Privacy Policy
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more

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