1// Boost.Units - A C++ library for zero-overhead dimensional analysis and
2// unit/quantity manipulation and conversion
3//
4// Copyright (C) 2003-2008 Matthias Christian Schabel
5// Copyright (C) 2008 Steven Watanabe
6//
7// Distributed under the Boost Software License, Version 1.0. (See
8// accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11/**
12\file
13
14\brief test_units_1.cpp
15
16\details
17Test unit class.
18
19Output:
20@verbatim
21@endverbatim
22**/
23
24#include <limits>
25
26#include <boost/units/cmath.hpp>
27
28#include "test_header.hpp"
29
30namespace bu = boost::units;
31
32int main()
33{
34 BOOST_CONSTEXPR_OR_CONST double inf = std::numeric_limits<double>::infinity(),
35 nan = std::numeric_limits<double>::quiet_NaN();
36
37 // default constructor
38 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::energy> E1(0.0*bu::joules),
39 E2(inf*bu::joules),
40 E3(nan*bu::joules);
41
42 BOOST_TEST((bu::isfinite)(E1) == true);
43 BOOST_TEST((bu::isfinite)(E2) == false);
44 BOOST_TEST((bu::isfinite)(E3) == false);
45
46 BOOST_TEST((bu::isinf)(E1) == false);
47 BOOST_TEST((bu::isinf)(E2) == true);
48 BOOST_TEST((bu::isinf)(E3) == false);
49
50 BOOST_TEST((bu::isnan)(E1) == false);
51 BOOST_TEST((bu::isnan)(E2) == false);
52 BOOST_TEST((bu::isnan)(E3) == true);
53
54 BOOST_TEST((bu::isnormal)(E1) == false);
55 BOOST_TEST((bu::isnormal)(E2) == false);
56 BOOST_TEST((bu::isnormal)(E3) == false);
57
58 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::energy> E4(-2.5*bu::joules),
59 E5(2.5*bu::joules);
60
61 BOOST_TEST((bu::isgreater)(E4,E5) == false);
62 BOOST_TEST((bu::isgreater)(E5,E4) == true);
63 BOOST_TEST((bu::isgreater)(E4,E4) == false);
64 BOOST_TEST((bu::isgreater)(E3,E4) == false);
65 BOOST_TEST((bu::isgreater)(E4,E3) == false);
66
67 BOOST_TEST((bu::isgreaterequal)(E4,E5) == false);
68 BOOST_TEST((bu::isgreaterequal)(E5,E4) == true);
69 BOOST_TEST((bu::isgreaterequal)(E4,E4) == true);
70 BOOST_TEST((bu::isgreaterequal)(E3,E4) == false);
71 BOOST_TEST((bu::isgreaterequal)(E4,E3) == false);
72
73 BOOST_TEST((bu::isless)(E4,E5) == true);
74 BOOST_TEST((bu::isless)(E5,E4) == false);
75 BOOST_TEST((bu::isless)(E4,E4) == false);
76 BOOST_TEST((bu::isless)(E3,E4) == false);
77 BOOST_TEST((bu::isless)(E4,E3) == false);
78
79 BOOST_TEST((bu::islessequal)(E4,E5) == true);
80 BOOST_TEST((bu::islessequal)(E5,E4) == false);
81 BOOST_TEST((bu::islessequal)(E4,E4) == true);
82 BOOST_TEST((bu::islessequal)(E3,E4) == false);
83 BOOST_TEST((bu::islessequal)(E4,E3) == false);
84
85 BOOST_TEST((bu::islessgreater)(E4,E5) == true);
86 BOOST_TEST((bu::islessgreater)(E5,E4) == true);
87 BOOST_TEST((bu::islessgreater)(E4,E4) == false);
88 BOOST_TEST((bu::islessgreater)(E3,E4) == false);
89 BOOST_TEST((bu::islessgreater)(E4,E3) == false);
90
91 BOOST_TEST((bu::isunordered)(E4,E5) == false);
92 BOOST_TEST((bu::isunordered)(E5,E4) == false);
93 BOOST_TEST((bu::isunordered)(E4,E4) == false);
94 BOOST_TEST((bu::isunordered)(E3,E4) == true);
95 BOOST_TEST((bu::isunordered)(E4,E3) == true);
96
97 BOOST_TEST((bu::abs)(E4) == E5);
98 BOOST_TEST((bu::ceil)(E4) == -2.0*bu::joules);
99 BOOST_TEST((bu::copysign)(E4,E5) == E5);
100 BOOST_TEST((bu::fabs)(E4) == E5);
101 BOOST_TEST((bu::floor)(E4) == -3.0*bu::joules);
102 BOOST_TEST((bu::fdim)(E4,E5) == 0.0*bu::joules);
103 BOOST_TEST((bu::fdim)(E5,E4) == E5-E4);
104
105 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::length> L1(3.0*bu::meters),
106 L2(4.0*bu::meters);
107 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::area> A1(4.0*bu::square_meters),
108 A2(L1*L2+A1);
109
110#if 0
111 BOOST_TEST((bu::fma)(L1,L2,A1) == A2);
112#endif
113
114 BOOST_TEST((bu::fmax)(E4,E5) == E5);
115 BOOST_TEST((bu::fmin)(E4,E5) == E4);
116
117 // need to test fpclassify
118
119 BOOST_TEST(bu::hypot(L1,L2) == 5.0*bu::meters);
120
121#if 0
122
123// BOOST_TEST(bu::llrint(E4).value() == bu::detail::llrint(E4.value()));
124// BOOST_TEST(bu::llround(E4).value() == bu::detail::llround(E4.value()));
125 BOOST_TEST((bu::nearbyint)(E4).value() == (bu::detail::nearbyint)(E4.value()));
126 BOOST_TEST((bu::rint)(E4).value() == (bu::detail::rint)(E4.value()));
127
128#endif
129
130 BOOST_TEST((bu::nextafter)(E4,E5).value() == (boost::math::nextafter)(E4.value(),E5.value()));
131 BOOST_TEST((bu::nextafter)(E5,E4).value() == (boost::math::nextafter)(E5.value(),E4.value()));
132
133 BOOST_TEST((bu::nexttoward)(E4,E5).value() == (boost::math::nextafter)(E4.value(),E5.value()));
134 BOOST_TEST((bu::nexttoward)(E5,E4).value() == (boost::math::nextafter)(E5.value(),E4.value()));
135
136 BOOST_TEST((bu::round)(E4 - 0.00000000001 * bu::joules) == -3.0*bu::joules);
137 BOOST_TEST((bu::round)(E5 + 0.00000000001 * bu::joules) == 3.0*bu::joules);
138 BOOST_TEST((bu::signbit)(E4) != 0);
139 BOOST_TEST((bu::signbit)(E5) == 0);
140 BOOST_TEST((bu::trunc)(E4) == -2.0*bu::joules);
141 BOOST_TEST((bu::trunc)(E5) == 2.0*bu::joules);
142
143 BOOST_TEST((bu::fmod)(E4,E5) == -0.0*bu::joules);
144
145 bu::quantity<bu::energy> pint;
146
147 BOOST_TEST((bu::modf)(E4,&pint) == -0.5*bu::joules);
148 BOOST_TEST(pint == -2.0*bu::joules);
149
150 int ex;
151 const bu::quantity<bu::energy> E6((bu::frexp)(q: E4,ex: &ex));
152
153 BOOST_TEST(E6 == -0.625*bu::joules);
154 BOOST_TEST(ex == 2);
155 BOOST_TEST((bu::ldexp)(E6,ex) == E4);
156
157 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::dimensionless> E7(1.0);
158
159 BOOST_TEST(bu::pow(E7,E7) == 1.0*1.0);
160
161 const bu::quantity<bu::dimensionless> E8((bu::exp)(q: E7));
162
163 BOOST_TEST(std::abs(E8 - std::exp(1.0)) < .000001);
164 BOOST_TEST(bu::log(E8) == E7);
165
166 BOOST_CONSTEXPR_OR_CONST bu::quantity<bu::dimensionless> E9(100.0);
167
168 BOOST_TEST(bu::log10(E9) == 2.0);
169
170 BOOST_TEST(bu::sqrt(A1) == 2.0*bu::meters);
171
172 return boost::report_errors();
173}
174

source code of boost/libs/units/test/test_cmath.cpp