test_real44.h (14201B)
1 /* Copyright (C) 2013-2023, 2025 Vincent Forest (vaplv@free.fr) 2 * 3 * The RSys library is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published 5 * by the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * The RSys library is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with the RSys library. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "rsys.h" 17 #include <float.h> 18 19 #define REALX_DIMENSION__ 4 20 #define REALY_DIMENSION__ 4 21 #include "realXY_begin.h" 22 23 #define REAL REAL_TYPE__ 24 #define REAL_COMPATIBLE REAL_TYPE_COMPATIBLE__ 25 26 #define CHECK_REAL4(A, B) \ 27 { \ 28 const REAL* a__ = (A); \ 29 const REAL* b__ = (B); \ 30 int i__; \ 31 FOR_EACH(i__, 0, 4) \ 32 CHK(a__[i__] == b__[i__]); \ 33 } (void)0 34 #define CHECK_REAL44(A, B) \ 35 { \ 36 const REAL* a__ = (A); \ 37 const REAL* b__ = (B); \ 38 int i__; \ 39 FOR_EACH(i__, 0, 16) \ 40 CHK(a__[i__] == b__[i__]); \ 41 } (void)0 42 43 int 44 main(int argc, char** argv) 45 { 46 REAL a[16], b[16], dst[16], c[16]; 47 REAL_COMPATIBLE d[16]; 48 int i; 49 (void)argc, (void)argv; 50 51 REALXY_FUNC__(set)(a, REALXY_FUNC__(splat)(c, -1.0)); 52 FOR_EACH(i, 0, 16) { 53 CHK(a[i] == -1.0); 54 CHK(c[i] == -1.0); 55 } 56 REALXY_CTOR__ 57 (a, 58 0.0, 1.0, 2.0, 3.0, 59 4.0, 5.0, 6.0, 7.0, 60 8.0, 9.0, 10.0, 11.0, 61 12.0, 13.0, 14.0, 15.0); 62 FOR_EACH(i, 0, 16) { 63 CHK(a[i] == (REAL)i); 64 } 65 CHECK_REAL44 66 (REALXY_FUNC__(set_identity)(a),REALXY_CTOR__(c, 67 1.0, 0.0, 0.0, 0.0, 68 0.0, 1.0, 0.0, 0.0, 69 0.0, 0.0, 1.0, 0.0, 70 0.0, 0.0, 0.0, 1.0)); 71 CHECK_REAL44 72 (a, REALXY_CTOR__(c, 73 1.0, 0.0, 0.0, 0.0, 74 0.0, 1.0, 0.0, 0.0, 75 0.0, 0.0, 1.0, 0.0, 76 0.0, 0.0, 0.0, 1.0)); 77 CHK(REALXY_FUNC__(is_identity)(a) == 1); 78 REALXY_FUNC__(set)(c, a); 79 FOR_EACH(i, 0, REALX_DIMENSION__*REALY_DIMENSION__) { 80 REAL_TYPE__ r = c[i]; 81 c[i] = c[i] + REAL_EPSILON__; 82 CHK(REALXY_FUNC__(is_identity)(c) == 0); 83 c[i] = r; 84 } 85 86 d[0] = (REAL_COMPATIBLE)0.1; 87 d[1] = (REAL_COMPATIBLE)(1.0/3.0); 88 d[2] = (REAL_COMPATIBLE)0.3; 89 d[3] = (REAL_COMPATIBLE)-0.7; 90 d[4] = (REAL_COMPATIBLE)0.9; 91 d[5] = (REAL_COMPATIBLE)-0.41; 92 d[6] = (REAL_COMPATIBLE)0.22; 93 d[7] = (REAL_COMPATIBLE)-0.01; 94 d[8] = (REAL_COMPATIBLE)0.02; 95 d[9] = (REAL_COMPATIBLE)1.1; 96 d[10] = (REAL_COMPATIBLE)0.05; 97 d[11] = (REAL_COMPATIBLE)-0.0125; 98 d[12] = (REAL_COMPATIBLE)3.14; 99 d[13] = (REAL_COMPATIBLE)1.23; 100 d[14] = (REAL_COMPATIBLE)-4.56; 101 d[15] = (REAL_COMPATIBLE)2.02; 102 103 REALXY_CTOR__(c, 104 (REAL)(REAL_COMPATIBLE)0.1, 105 (REAL)(REAL_COMPATIBLE)(1.0/3.0), 106 (REAL)(REAL_COMPATIBLE)0.3, 107 (REAL)(REAL_COMPATIBLE)-0.7, 108 (REAL)(REAL_COMPATIBLE)0.9, 109 (REAL)(REAL_COMPATIBLE)-0.41, 110 (REAL)(REAL_COMPATIBLE)0.22, 111 (REAL)(REAL_COMPATIBLE)-0.01, 112 (REAL)(REAL_COMPATIBLE)0.02, 113 (REAL)(REAL_COMPATIBLE)1.1, 114 (REAL)(REAL_COMPATIBLE)0.05, 115 (REAL)(REAL_COMPATIBLE)-0.0125, 116 (REAL)(REAL_COMPATIBLE)3.14, 117 (REAL)(REAL_COMPATIBLE)1.23, 118 (REAL)(REAL_COMPATIBLE)-4.56, 119 (REAL)(REAL_COMPATIBLE)2.02); 120 CHECK_REAL44(REALXY_CAST__(dst, d), c); 121 122 REALXY_FUNC__(splat)(a, -1.0); 123 CHECK_REAL44 124 (REALXY_FUNC__(set_row)(a, REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0), 0), 125 REALXY_CTOR__(c, 126 0.0, -1.0, -1.0, -1.0, 127 1.0, -1.0, -1.0, -1.0, 128 2.0, -1.0, -1.0, -1.0, 129 3.0, -1.0, -1.0, -1.0)); 130 CHECK_REAL44 131 (a, REALXY_CTOR__(c, 132 0.0, -1.0, -1.0, -1.0, 133 1.0, -1.0, -1.0, -1.0, 134 2.0, -1.0, -1.0, -1.0, 135 3.0, -1.0, -1.0, -1.0)); 136 CHECK_REAL44 137 (REALXY_FUNC__(set_row)(a, REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0), 1), 138 REALXY_CTOR__(c, 139 0.0, 4.0, -1.0, -1.0, 140 1.0, 5.0, -1.0, -1.0, 141 2.0, 6.0, -1.0, -1.0, 142 3.0, 7.0, -1.0, -1.0)); 143 CHECK_REAL44 144 (a, REALXY_CTOR__(c, 145 0.0, 4.0, -1.0, -1.0, 146 1.0, 5.0, -1.0, -1.0, 147 2.0, 6.0, -1.0, -1.0, 148 3.0, 7.0, -1.0, -1.0)); 149 CHECK_REAL44 150 (REALXY_FUNC__(set_row)(a, REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0), 2), 151 REALXY_CTOR__(c, 152 0.0, 4.0, 8.0, -1.0, 153 1.0, 5.0, 9.0, -1.0, 154 2.0, 6.0, 10.0, -1.0, 155 3.0, 7.0, 11.0, -1.0)); 156 CHECK_REAL44 157 (a, REALXY_CTOR__(c, 158 0.0, 4.0, 8.0, -1.0, 159 1.0, 5.0, 9.0, -1.0, 160 2.0, 6.0, 10.0, -1.0, 161 3.0, 7.0, 11.0, -1.0)); 162 CHECK_REAL44 163 (REALXY_FUNC__(set_row)(a, REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0), 3), 164 REALXY_CTOR__(c, 165 0.0, 4.0, 8.0, 12.0, 166 1.0, 5.0, 9.0, 13.0, 167 2.0, 6.0, 10.0, 14.0, 168 3.0, 7.0, 11.0, 15.0)); 169 CHECK_REAL44 170 (a, REALXY_CTOR__(c, 171 0.0, 4.0, 8.0, 12.0, 172 1.0, 5.0, 9.0, 13.0, 173 2.0, 6.0, 10.0, 14.0, 174 3.0, 7.0, 11.0, 15.0)); 175 176 CHECK_REAL44 177 (REALXY_FUNC__(transpose)(a, a), REALXY_CTOR__(c, 178 0.0, 1.0, 2.0, 3.0, 179 4.0, 5.0, 6.0, 7.0, 180 8.0, 9.0, 10.0, 11.0, 181 12.0, 13.0, 14.0, 15.0)); 182 CHECK_REAL44 183 (a, REALXY_CTOR__(c, 184 0.0, 1.0, 2.0, 3.0, 185 4.0, 5.0, 6.0, 7.0, 186 8.0, 9.0, 10.0, 11.0, 187 12.0, 13.0, 14.0, 15.0)); 188 CHECK_REAL44 189 (REALXY_FUNC__(transpose)(b, a),REALXY_CTOR__(c, 190 0.0, 4.0, 8.0, 12.0, 191 1.0, 5.0, 9.0, 13.0, 192 2.0, 6.0, 10.0, 14.0, 193 3.0, 7.0, 11.0, 15.0)); 194 CHECK_REAL44 195 (b, REALXY_CTOR__(c, 196 0.0, 4.0, 8.0, 12.0, 197 1.0, 5.0, 9.0, 13.0, 198 2.0, 6.0, 10.0, 14.0, 199 3.0, 7.0, 11.0, 15.0)); 200 201 REALXY_FUNC__(splat)(a, -1.0); 202 CHECK_REAL44 203 (REALXY_FUNC__(set_col)(a, REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0), 0), 204 REALXY_CTOR__(c, 205 0.0, 1.0, 2.0, 3.0, 206 -1.0, -1.0, -1.0, -1.0, 207 -1.0, -1.0, -1.0, -1.0, 208 -1.0, -1.0, -1.0, -1.0)); 209 CHECK_REAL44 210 (a, REALXY_CTOR__(c, 211 0.0, 1.0, 2.0, 3.0, 212 -1.0, -1.0, -1.0, -1.0, 213 -1.0, -1.0, -1.0, -1.0, 214 -1.0, -1.0, -1.0, -1.0)); 215 CHECK_REAL44 216 (REALXY_FUNC__(set_col)(a, REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0), 1), 217 REALXY_CTOR__(c, 218 0.0, 1.0, 2.0, 3.0, 219 4.0, 5.0, 6.0, 7.0, 220 -1.0, -1.0, -1.0, -1.0, 221 -1.0, -1.0, -1.0, -1.0)); 222 CHECK_REAL44 223 (a, REALXY_CTOR__(c, 224 0.0, 1.0, 2.0, 3.0, 225 4.0, 5.0, 6.0, 7.0, 226 -1.0, -1.0, -1.0, -1.0, 227 -1.0, -1.0, -1.0, -1.0)); 228 CHECK_REAL44 229 (REALXY_FUNC__(set_col)(a, REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0), 2), 230 REALXY_CTOR__(c, 231 0.0, 1.0, 2.0, 3.0, 232 4.0, 5.0, 6.0, 7.0, 233 8.0, 9.0, 10.0, 11.0, 234 -1.0, -1.0, -1.0, -1.0)); 235 CHECK_REAL44 236 (a, REALXY_CTOR__(c, 237 0.0, 1.0, 2.0, 3.0, 238 4.0, 5.0, 6.0, 7.0, 239 8.0, 9.0, 10.0, 11.0, 240 -1.0, -1.0, -1.0, -1.0)); 241 CHECK_REAL44 242 (REALXY_FUNC__(set_col)(a, REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0), 3), 243 REALXY_CTOR__(c, 244 0.0, 1.0, 2.0, 3.0, 245 4.0, 5.0, 6.0, 7.0, 246 8.0, 9.0, 10.0, 11.0, 247 12.0, 13.0, 14.0, 15.0)); 248 CHECK_REAL44 249 (a, REALXY_CTOR__(c, 250 0.0, 1.0, 2.0, 3.0, 251 4.0, 5.0, 6.0, 7.0, 252 8.0, 9.0, 10.0, 11.0, 253 12.0, 13.0, 14.0, 15.0)); 254 255 CHECK_REAL4(REALXY_FUNC__(row)(b + 1, a, 0), REALX_CTOR__(c, 0.0, 4.0, 8.0, 12.0)); 256 CHECK_REAL4(b + 1, REALX_CTOR__(c, 0.0, 4.0, 8.0, 12.0)); 257 CHECK_REAL4(REALXY_FUNC__(row)(b + 2, a, 1), REALX_CTOR__(c, 1.0, 5.0, 9.0, 13.0)); 258 CHECK_REAL4(b + 2, REALX_CTOR__(c, 1.0, 5.0, 9.0, 13.0)); 259 CHECK_REAL4(REALXY_FUNC__(row)(b + 8, a, 2), REALX_CTOR__(c, 2.0, 6.0, 10.0, 14.0)); 260 CHECK_REAL4(b + 8, REALX_CTOR__(c, 2.0, 6.0, 10.0, 14.0)); 261 CHECK_REAL4(REALXY_FUNC__(row)(b + 5, a, 2), REALX_CTOR__(c, 2.0, 6.0, 10.0, 14.0)); 262 CHECK_REAL4(b + 5, REALX_CTOR__(c, 2.0, 6.0, 10.0, 14.0)); 263 264 CHECK_REAL4(REALXY_FUNC__(col)(b + 2, a, 0), REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0)); 265 CHECK_REAL4(b + 2, REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0)); 266 CHECK_REAL4(REALXY_FUNC__(col)(b + 1, a, 1), REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0)); 267 CHECK_REAL4(b + 1, REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0)); 268 CHECK_REAL4(REALXY_FUNC__(col)(b + 5, a, 2), REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0)); 269 CHECK_REAL4(b + 5, REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0)); 270 CHECK_REAL4(REALXY_FUNC__(col)(b + 5, a, 3), REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0)); 271 CHECK_REAL4(b + 5, REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0)); 272 CHECK_REAL4(REALXY_FUNC__(col_ptr)(a, 0), REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0)); 273 CHECK_REAL4(REALXY_FUNC__(col_ptr)(a, 1), REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0)); 274 CHECK_REAL4(REALXY_FUNC__(col_ptr)(a, 2), REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0)); 275 CHECK_REAL4(REALXY_FUNC__(col_ptr)(a, 3), REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0)); 276 CHECK_REAL4(REALXY_FUNC__(col_cptr)(a, 0), REALX_CTOR__(c, 0.0, 1.0, 2.0, 3.0)); 277 CHECK_REAL4(REALXY_FUNC__(col_cptr)(a, 1), REALX_CTOR__(c, 4.0, 5.0, 6.0, 7.0)); 278 CHECK_REAL4(REALXY_FUNC__(col_cptr)(a, 2), REALX_CTOR__(c, 8.0, 9.0, 10.0, 11.0)); 279 CHECK_REAL4(REALXY_FUNC__(col_cptr)(a, 3), REALX_CTOR__(c, 12.0, 13.0, 14.0, 15.0)); 280 281 CHECK_REAL4 282 (REALXY_REALX_FUNC__(mul)(dst, a, REALX_CTOR__(c, 1.0, 2.0, 3.0, 1.0)), 283 REALX_CTOR__(c, 44.0, 51.0, 58.0, 65.0)); 284 CHECK_REAL4(dst, REALX_CTOR__(c, 44.0, 51.0, 58.0, 65.0)); 285 CHECK_REAL4 286 (REALX_REALXY_FUNC__(mul)(dst, REALX_CTOR__(c, 1.0, 2.0, 3.0, 1.0), a), 287 REALX_CTOR__(c, 11.0, 39.0, 67.0, 95.0)); 288 CHECK_REAL4(dst, REALX_CTOR__(c, 11.0, 39.0, 67.0, 95.0)); 289 CHECK_REAL44 290 (REALXY_FUNC__(mul)(dst, a, -1.0), REALXY_CTOR__(c, 291 0.0, -1.0, -2.0, -3.0, 292 -4.0, -5.0, -6.0, -7.0, 293 -8.0, -9.0, -10.0, -11.0, 294 -12.0, -13.0, -14.0, -15.0)); 295 CHECK_REAL44 296 (dst, REALXY_CTOR__(c, 297 0.0, -1.0, -2.0, -3.0, 298 -4.0, -5.0, -6.0, -7.0, 299 -8.0, -9.0, -10.0, -11.0, 300 -12.0, -13.0, -14.0, -15.0)); 301 302 REALXY_CTOR__ 303 (a, 304 1.0, 2.0, 3.0, 4.0, 305 4.0, 5.0, 6.0, 7.0, 306 7.0, 8.0, 9.0, 10.0, 307 10.0, 11.0, 12.0, 13.0); 308 REALXY_CTOR__ 309 (b, 310 2.0, 9.0, 8.0, 1.0, 311 1.0, -2.0, 2.0, 1.0, 312 1.0, -8.0, -4.0, 2.0, 313 1.0, 3.0, 4.0, 2.0); 314 CHECK_REAL44 315 (REALXY_REALXY_FUNC__(mul)(dst, a, b), REALXY_CTOR__(c, 316 104.0, 124.0, 144.0, 164.0, 317 17.0, 19.0, 21.0, 23.0, 318 -39.0, -48.0, -57.0, -66.0, 319 61.0, 71.0, 81.0, 91.0)); 320 CHECK_REAL44 321 (dst, REALXY_CTOR__(c, 322 104.0, 124.0, 144.0, 164.0, 323 17.0, 19.0, 21.0, 23.0, 324 -39.0, -48.0, -57.0, -66.0, 325 61.0, 71.0, 81.0, 91.0)); 326 CHECK_REAL44 327 (REALXY_REALXY_FUNC__(mul)(a, a, b), REALXY_CTOR__(c, 328 104.0, 124.0, 144.0, 164.0, 329 17.0, 19.0, 21.0, 23.0, 330 -39.0, -48.0, -57.0, -66.0, 331 61.0, 71.0, 81.0, 91.0)); 332 CHECK_REAL44 333 (a, REALXY_CTOR__(c, 334 104.0, 124.0, 144.0, 164.0, 335 17.0, 19.0, 21.0, 23.0, 336 -39.0, -48.0, -57.0, -66.0, 337 61.0, 71.0, 81.0, 91.0)); 338 REALXY_CTOR__ 339 (a, 340 1.0, 2.0, 3.0, 4.0, 341 4.0, 5.0, 6.0, 7.0, 342 7.0, 8.0, 9.0, 10.0, 343 10.0, 11.0, 12.0, 13.0); 344 CHECK_REAL44 345 (REALXY_REALXY_FUNC__(mul)(b, a, b), REALXY_CTOR__(c, 346 104.0, 124.0, 144.0, 164.0, 347 17.0, 19.0, 21.0, 23.0, 348 -39.0, -48.0, -57.0, -66.0, 349 61.0, 71.0, 81.0, 91.0)); 350 CHECK_REAL44 351 (b, REALXY_CTOR__(c, 352 104.0, 124.0, 144.0, 164.0, 353 17.0, 19.0, 21.0, 23.0, 354 -39.0, -48.0, -57.0, -66.0, 355 61.0, 71.0, 81.0, 91.0)); 356 357 REALXY_CTOR__ 358 (a, 359 0.0, 1.0, 2.0, 3.0, 360 4.0, 5.0, 6.0, 7.0, 361 8.0, 9.0, 10.0, 11.0, 362 12.0, 13.0, 14.0, 15.0); 363 REALXY_CTOR__ 364 (b, 365 0.0, 2.0, 1.0, 3.0, 366 1.0, -2.0, -1.0, -3.0, 367 1.0, 0.0, 0.0, 2.0, 368 3.0, 2.0, 1.0, 0.0); 369 CHECK_REAL44 370 (REALXY_FUNC__(add)(dst, a, b), REALXY_CTOR__(c, 371 0.0, 3.0, 3.0, 6.0, 372 5.0, 3.0, 5.0, 4.0, 373 9.0, 9.0, 10.0, 13.0, 374 15.0, 15.0, 15.0, 15.0)); 375 CHECK_REAL44 376 (dst, REALXY_CTOR__(c, 377 0.0, 3.0, 3.0, 6.0, 378 5.0, 3.0, 5.0, 4.0, 379 9.0, 9.0, 10.0, 13.0, 380 15.0, 15.0, 15.0, 15.0)); 381 CHECK_REAL44 382 (REALXY_FUNC__(sub)(dst, a, b), REALXY_CTOR__(c, 383 0.0, -1.0, 1.0, 0.0, 384 3.0, 7.0, 7.0, 10.0, 385 7.0, 9.0, 10.0, 9.0, 386 9.0, 11.0, 13.0, 15.0)); 387 CHECK_REAL44 388 (dst, REALXY_CTOR__(c, 389 0.0, -1.0, 1.0, 0.0, 390 3.0, 7.0, 7.0, 10.0, 391 7.0, 9.0, 10.0, 9.0, 392 9.0, 11.0, 13.0, 15.0)); 393 CHECK_REAL44 394 (REALXY_FUNC__(minus)(a, b), REALXY_CTOR__(c, 395 0.0, -2.0, -1.0, -3.0, 396 -1.0, 2.0, 1.0, 3.0, 397 -1.0, 0.0, 0.0, -2.0, 398 -3.0, -2.0, -1.0, 0.0)); 399 CHECK_REAL44 400 (a, REALXY_CTOR__(c, 401 0.0, -2.0, -1.0, -3.0, 402 -1.0, 2.0, 1.0, 3.0, 403 -1.0, 0.0, 0.0, -2.0, 404 -3.0, -2.0, -1.0, 0.0)); 405 406 REALXY_FUNC__(set)(a, b); 407 CHK(REALXY_FUNC__(eq)(a, b) == 1); 408 REALXY_FUNC__(add)(a, a, REALXY_FUNC__(splat)(c, FLT_EPSILON)); 409 CHK(REALXY_FUNC__(eq_eps)(a, b, FLT_EPSILON) == 1); 410 CHK(REALXY_FUNC__(eq_eps)(a, b, FLT_EPSILON * (REAL)0.9) == 0); 411 412 REALXY_FUNC__(set) 413 (a, REALXY_CTOR__(c, 414 2.0, 9.0, 8.0, 1.0, 415 1.0, -2.0, 2.0, 1.0, 416 1.0, -8.0, -4.0, 2.0, 417 1.0, 3.0, 4.0, 2.0)); 418 CHK(REALXY_FUNC__(det)(a) == 78.0); 419 CHK(REALXY_FUNC__(inverse)(b, a) == 78.0); 420 REALXY_REALXY_FUNC__(mul)(dst, a, b); 421 CHK(REALXY_FUNC__(eq_eps) 422 (dst, REALXY_CTOR__(c, 423 1.0, 0.0, 0.0, 0.0, 424 0.0, 1.0, 0.0, 0.0, 425 0.0, 0.0, 1.0, 0.0, 426 0.0, 0.0, 0.0, 1.0), 427 1.e-6f)); 428 CHK(REALXY_FUNC__(invtrans)(a, a) == 78.0); 429 REALXY_FUNC__(transpose)(a, a); 430 CHECK_REAL44(a, b); 431 432 return 0; 433 }