2 // SPDX-License-Identifier: BSD-3-Clause
3 // Copyright Contributors to the OpenEXR Project.
11 #if __cplusplus >= 202002L
23 #if __cplusplus < 202002L
24 template <typename To, typename From>
28 static_assert (sizeof (From) == sizeof (To), "Type sizes do not match");
40 testf (float f, bool changeExpected = true)
44 float sf = IMATH_INTERNAL_NAMESPACE::succf (f);
45 float pf = IMATH_INTERNAL_NAMESPACE::predf (f);
46 float spf = IMATH_INTERNAL_NAMESPACE::succf (IMATH_INTERNAL_NAMESPACE::predf (f));
47 float psf = IMATH_INTERNAL_NAMESPACE::predf (IMATH_INTERNAL_NAMESPACE::succf (f));
49 printf ("f %.9g %" PRIx32 "\n", f, bit_cast<uint32_t> (f));
50 printf ("sf %.9g %" PRIx32 "\n", sf, bit_cast<uint32_t> (sf));
51 printf ("pf %.9g %" PRIx32 "\n", pf, bit_cast<uint32_t> (pf));
52 printf ("spf %.9g %" PRIx32 "\n", spf, bit_cast<uint32_t> (spf));
53 printf ("psf %.9g %" PRIx32 "\n", psf, bit_cast<uint32_t> (psf));
66 // If f is nan, pf and sf may be converted from signaling
67 // to quiet nan, but they'll still be nan's.
73 // No bit change expected if input was inf.
74 assert (bit_cast<uint32_t> (pf) == bit_cast<uint32_t> (f));
75 assert (bit_cast<uint32_t> (sf) == bit_cast<uint32_t> (f));
81 testd (double d, bool changeExpected = true)
85 double sd = IMATH_INTERNAL_NAMESPACE::succd (d);
86 double pd = IMATH_INTERNAL_NAMESPACE::predd (d);
87 double spd = IMATH_INTERNAL_NAMESPACE::succd (IMATH_INTERNAL_NAMESPACE::predd (d));
88 double psd = IMATH_INTERNAL_NAMESPACE::predd (IMATH_INTERNAL_NAMESPACE::succd (d));
90 printf ("d %0.18lg %" PRIx64 "\n", d, bit_cast<uint64_t> (d));
91 printf ("sd %0.18lg %" PRIx64 "\n", sd, bit_cast<uint64_t> (sd));
92 printf ("pd %0.18lg %" PRIx64 "\n", pd, bit_cast<uint64_t> (pd));
93 printf ("spd %0.18lg %" PRIx64 "\n", spd, bit_cast<uint64_t> (spd));
94 printf ("psd %0.18lg %" PRIx64 "\n", psd, bit_cast<uint64_t> (psd));
107 // If f is nan, pf and sf may be converted from signaling
108 // to quiet nan, but they'll still be nan's.
114 // No bit change expected if input was inf.
115 assert (bit_cast<uint64_t> (pd) == bit_cast<uint64_t> (d));
116 assert (bit_cast<uint64_t> (sd) == bit_cast<uint64_t> (d));
124 cout << "Testing functions in ImathFun.h" << endl;
126 cout << "floor" << endl;
128 assert (IMATH_INTERNAL_NAMESPACE::floor (0.0f) == 0);
129 assert (IMATH_INTERNAL_NAMESPACE::floor (0.5f) == 0);
130 assert (IMATH_INTERNAL_NAMESPACE::floor (-0.5f) == -1);
131 assert (IMATH_INTERNAL_NAMESPACE::floor (1.0f) == 1);
132 assert (IMATH_INTERNAL_NAMESPACE::floor (-1.0f) == -1);
133 assert (IMATH_INTERNAL_NAMESPACE::floor (1.5f) == 1);
134 assert (IMATH_INTERNAL_NAMESPACE::floor (-1.5f) == -2);
136 cout << "ceil" << endl;
138 assert (IMATH_INTERNAL_NAMESPACE::ceil (0.0f) == 0);
139 assert (IMATH_INTERNAL_NAMESPACE::ceil (0.5f) == 1);
140 assert (IMATH_INTERNAL_NAMESPACE::ceil (-0.5f) == 0);
141 assert (IMATH_INTERNAL_NAMESPACE::ceil (1.0f) == 1);
142 assert (IMATH_INTERNAL_NAMESPACE::ceil (-1.0f) == -1);
143 assert (IMATH_INTERNAL_NAMESPACE::ceil (1.5f) == 2);
144 assert (IMATH_INTERNAL_NAMESPACE::ceil (-1.5f) == -1);
146 cout << "trunc" << endl;
148 assert (IMATH_INTERNAL_NAMESPACE::trunc (0.0f) == 0);
149 assert (IMATH_INTERNAL_NAMESPACE::trunc (0.5f) == 0);
150 assert (IMATH_INTERNAL_NAMESPACE::trunc (-0.5f) == 0);
151 assert (IMATH_INTERNAL_NAMESPACE::trunc (1.0f) == 1);
152 assert (IMATH_INTERNAL_NAMESPACE::trunc (-1.0f) == -1);
153 assert (IMATH_INTERNAL_NAMESPACE::trunc (1.5f) == 1);
154 assert (IMATH_INTERNAL_NAMESPACE::trunc (-1.5f) == -1);
156 cout << "divs / mods" << endl;
158 assert (IMATH_INTERNAL_NAMESPACE::divs (5, 2) == 2 &&
159 IMATH_INTERNAL_NAMESPACE::mods (5, 2) == 1);
160 assert (IMATH_INTERNAL_NAMESPACE::divs (4, 2) == 2 &&
161 IMATH_INTERNAL_NAMESPACE::mods (4, 2) == 0);
162 assert (IMATH_INTERNAL_NAMESPACE::divs (3, 2) == 1 &&
163 IMATH_INTERNAL_NAMESPACE::mods (3, 2) == 1);
164 assert (IMATH_INTERNAL_NAMESPACE::divs (2, 2) == 1 &&
165 IMATH_INTERNAL_NAMESPACE::mods (2, 2) == 0);
166 assert (IMATH_INTERNAL_NAMESPACE::divs (1, 2) == 0 &&
167 IMATH_INTERNAL_NAMESPACE::mods (1, 2) == 1);
168 assert (IMATH_INTERNAL_NAMESPACE::divs (0, 2) == 0 &&
169 IMATH_INTERNAL_NAMESPACE::mods (0, 2) == 0);
170 assert (IMATH_INTERNAL_NAMESPACE::divs (-1, 2) == 0 &&
171 IMATH_INTERNAL_NAMESPACE::mods (-1, 2) == -1);
172 assert (IMATH_INTERNAL_NAMESPACE::divs (-2, 2) == -1 &&
173 IMATH_INTERNAL_NAMESPACE::mods (-2, 2) == 0);
174 assert (IMATH_INTERNAL_NAMESPACE::divs (-3, 2) == -1 &&
175 IMATH_INTERNAL_NAMESPACE::mods (-3, 2) == -1);
176 assert (IMATH_INTERNAL_NAMESPACE::divs (-4, 2) == -2 &&
177 IMATH_INTERNAL_NAMESPACE::mods (-4, 2) == 0);
178 assert (IMATH_INTERNAL_NAMESPACE::divs (-5, 2) == -2 &&
179 IMATH_INTERNAL_NAMESPACE::mods (-5, 2) == -1);
181 assert (IMATH_INTERNAL_NAMESPACE::divs (5, -2) == -2 &&
182 IMATH_INTERNAL_NAMESPACE::mods (5, -2) == 1);
183 assert (IMATH_INTERNAL_NAMESPACE::divs (4, -2) == -2 &&
184 IMATH_INTERNAL_NAMESPACE::mods (4, -2) == 0);
185 assert (IMATH_INTERNAL_NAMESPACE::divs (3, -2) == -1 &&
186 IMATH_INTERNAL_NAMESPACE::mods (3, -2) == 1);
187 assert (IMATH_INTERNAL_NAMESPACE::divs (2, -2) == -1 &&
188 IMATH_INTERNAL_NAMESPACE::mods (2, -2) == 0);
189 assert (IMATH_INTERNAL_NAMESPACE::divs (1, -2) == 0 &&
190 IMATH_INTERNAL_NAMESPACE::mods (1, -2) == 1);
191 assert (IMATH_INTERNAL_NAMESPACE::divs (0, -2) == 0 &&
192 IMATH_INTERNAL_NAMESPACE::mods (0, -2) == 0);
193 assert (IMATH_INTERNAL_NAMESPACE::divs (-1, -2) == 0 &&
194 IMATH_INTERNAL_NAMESPACE::mods (-1, -2) == -1);
195 assert (IMATH_INTERNAL_NAMESPACE::divs (-2, -2) == 1 &&
196 IMATH_INTERNAL_NAMESPACE::mods (-2, -2) == 0);
197 assert (IMATH_INTERNAL_NAMESPACE::divs (-3, -2) == 1 &&
198 IMATH_INTERNAL_NAMESPACE::mods (-3, -2) == -1);
199 assert (IMATH_INTERNAL_NAMESPACE::divs (-4, -2) == 2 &&
200 IMATH_INTERNAL_NAMESPACE::mods (-4, -2) == 0);
201 assert (IMATH_INTERNAL_NAMESPACE::divs (-5, -2) == 2 &&
202 IMATH_INTERNAL_NAMESPACE::mods (-5, -2) == -1);
204 cout << "divp / modp" << endl;
206 assert (IMATH_INTERNAL_NAMESPACE::divp (5, 2) == 2 &&
207 IMATH_INTERNAL_NAMESPACE::modp (5, 2) == 1);
208 assert (IMATH_INTERNAL_NAMESPACE::divp (4, 2) == 2 &&
209 IMATH_INTERNAL_NAMESPACE::modp (4, 2) == 0);
210 assert (IMATH_INTERNAL_NAMESPACE::divp (3, 2) == 1 &&
211 IMATH_INTERNAL_NAMESPACE::modp (3, 2) == 1);
212 assert (IMATH_INTERNAL_NAMESPACE::divp (2, 2) == 1 &&
213 IMATH_INTERNAL_NAMESPACE::modp (2, 2) == 0);
214 assert (IMATH_INTERNAL_NAMESPACE::divp (1, 2) == 0 &&
215 IMATH_INTERNAL_NAMESPACE::modp (1, 2) == 1);
216 assert (IMATH_INTERNAL_NAMESPACE::divp (0, 2) == 0 &&
217 IMATH_INTERNAL_NAMESPACE::modp (0, 2) == 0);
218 assert (IMATH_INTERNAL_NAMESPACE::divp (-1, 2) == -1 &&
219 IMATH_INTERNAL_NAMESPACE::modp (-1, 2) == 1);
220 assert (IMATH_INTERNAL_NAMESPACE::divp (-2, 2) == -1 &&
221 IMATH_INTERNAL_NAMESPACE::modp (-2, 2) == 0);
222 assert (IMATH_INTERNAL_NAMESPACE::divp (-3, 2) == -2 &&
223 IMATH_INTERNAL_NAMESPACE::modp (-3, 2) == 1);
224 assert (IMATH_INTERNAL_NAMESPACE::divp (-4, 2) == -2 &&
225 IMATH_INTERNAL_NAMESPACE::modp (-4, 2) == 0);
226 assert (IMATH_INTERNAL_NAMESPACE::divp (-5, 2) == -3 &&
227 IMATH_INTERNAL_NAMESPACE::modp (-5, 2) == 1);
229 assert (IMATH_INTERNAL_NAMESPACE::divp (5, -2) == -2 &&
230 IMATH_INTERNAL_NAMESPACE::modp (5, -2) == 1);
231 assert (IMATH_INTERNAL_NAMESPACE::divp (4, -2) == -2 &&
232 IMATH_INTERNAL_NAMESPACE::modp (4, -2) == 0);
233 assert (IMATH_INTERNAL_NAMESPACE::divp (3, -2) == -1 &&
234 IMATH_INTERNAL_NAMESPACE::modp (3, -2) == 1);
235 assert (IMATH_INTERNAL_NAMESPACE::divp (2, -2) == -1 &&
236 IMATH_INTERNAL_NAMESPACE::modp (2, -2) == 0);
237 assert (IMATH_INTERNAL_NAMESPACE::divp (1, -2) == 0 &&
238 IMATH_INTERNAL_NAMESPACE::modp (1, -2) == 1);
239 assert (IMATH_INTERNAL_NAMESPACE::divp (0, -2) == 0 &&
240 IMATH_INTERNAL_NAMESPACE::modp (0, -2) == 0);
241 assert (IMATH_INTERNAL_NAMESPACE::divp (-1, -2) == 1 &&
242 IMATH_INTERNAL_NAMESPACE::modp (-1, -2) == 1);
243 assert (IMATH_INTERNAL_NAMESPACE::divp (-2, -2) == 1 &&
244 IMATH_INTERNAL_NAMESPACE::modp (-2, -2) == 0);
245 assert (IMATH_INTERNAL_NAMESPACE::divp (-3, -2) == 2 &&
246 IMATH_INTERNAL_NAMESPACE::modp (-3, -2) == 1);
247 assert (IMATH_INTERNAL_NAMESPACE::divp (-4, -2) == 2 &&
248 IMATH_INTERNAL_NAMESPACE::modp (-4, -2) == 0);
249 assert (IMATH_INTERNAL_NAMESPACE::divp (-5, -2) == 3 &&
250 IMATH_INTERNAL_NAMESPACE::modp (-5, -2) == 1);
252 cout << "successor, predecessor" << endl;
255 testf (0.0f * -1.0f);
262 union {float f; uint32_t i;} u;
263 u.i = 0x7f800000; // inf
265 u.i = 0xff800000; // -inf
267 u.i = 0x7f800001; // nan
269 u.i = 0x7f7fffff; // FLT_MAX
271 u.i = 0xff7fffff; // -FLT_MAX
282 union {double d; uint64_t i;} v;
283 v.i = 0x7ff0000000000000ULL; // inf
285 v.i = 0xfff0000000000000ULL; // -inf
287 v.i = 0x7ff0000000000001ULL; // NAN
289 v.i = 0x7fefffffffffffffULL; // FLT_MAX
291 v.i = 0xffefffffffffffffULL; // -FLT_MAX
294 cout << "ok\n" << endl;