1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: MIT (https://spdx.org/licenses/MIT) 4 * PURPOSE: Helpers for testing math functions 5 * COPYRIGHT: Copyright 2021 Timo Kreuzer <timo.kreuzer@reactos.org> 6 */ 7 8 #pragma once 9 10 #define _USE_MATH_DEFINES 11 #include <math.h> 12 #include <float.h> 13 #include <apitest.h> 14 15 static 16 __inline 17 double 18 u64_to_dbl(UINT64 x) 19 { 20 return *(double*)(&x); 21 } 22 23 static 24 __inline 25 UINT64 26 dbl_to_u64(double x) 27 { 28 return *(UINT64*)(&x); 29 } 30 31 static 32 __inline 33 float 34 u32_to_flt(UINT32 x) 35 { 36 return *(float*)(&x); 37 } 38 39 static 40 __inline 41 UINT32 42 flt_to_u32(float x) 43 { 44 return *(UINT32*)(&x); 45 } 46 47 typedef struct _TESTENTRY_DBL 48 { 49 unsigned long long x; 50 unsigned long long result; 51 } TESTENTRY_DBL; 52 53 typedef struct _TESTENTRY_FLT 54 { 55 unsigned long x; 56 unsigned long result; 57 } TESTENTRY_FLT; 58 59 #define ok_eq_dbl_exact_(file, line, func, ullx, z, ullexp) \ 60 { \ 61 double x = u64_to_dbl(ullx); \ 62 unsigned long long ullz = dbl_to_u64(z); \ 63 double exp = u64_to_dbl(ullexp); \ 64 ok_(file, line)(ullz == ullexp, "Wrong value for '%s(%f)' [0x%016llx], expected: %f [0x%016llx], got: %f [0x%016llx]\n", \ 65 func, x, ullx, exp, ullexp, z, ullz); \ 66 } 67 #define ok_eq_dbl_exact(func, ullx, z, ullexp) ok_eq_dbl_exact_(__FILE__, __LINE__, func, ullx, z, ullexp) 68 69 #define ok_eq_flt_exact_(file, line, func, ux, z, uexp) \ 70 { \ 71 float x = u32_to_flt(ux); \ 72 unsigned int uz = flt_to_u32(z); \ 73 float exp = u32_to_flt(uexp); \ 74 ok_(file, line)(uz == uexp, "Wrong value for '%s(%f)' [0x%08x], expected: %f [0x%08x], got: %f [0x%08x]\n", \ 75 func, x, ux, exp, uexp, z, uz); \ 76 } 77 #define ok_eq_flt_exact(func, ux, z, uexp) ok_eq_flt_exact_(__FILE__, __LINE__, func, ux, z, uexp) 78