%% options copyright owner = Dirk Krause copyright year = 2014 license = bsd %% header /** @file dk3madic.h Conversion from double to int/unsigned. */ #include #include #if DK3_HAVE_SYS_TYPES_H #include #endif #if DK3_HAVE_STDINT #include #endif #if DK3_HAVE_INTTYPES_H #include #endif #if DK3_HAVE_LIMITS_H #include #endif #if DK3_HAVE_MATH_H #include #endif #if DK3_HAVE_FLOAT_H #include #endif #ifdef __cplusplus extern "C" { #endif /** Convert double value to int. @param x Double value to convert. @param ec Pointer to error code variable. Set to DK3_ERROR_MATH_OVERFLOW if the absolute value of x is too large. @return Conversion result. */ int dk3ma_d_to_i_ok(double x, int *ec); /** Convert double value to unsigned. @param x Double value to convert. @param ec Pointer to error code variable. Set to DK3_ERROR_MATH_OVERFLOW if the absolute value of x is too large, DK3_ERROR_MATH_OUT_OF_RANGE for negative x. @return Conversion result. */ unsigned dk3ma_d_to_u_ok(double x, int *ec); #ifdef __cplusplus } #endif %% module #include "dk3ma.h" $!trace-include int dk3ma_d_to_i_ok(double x, int *ec) { int back = 0; if ((double)DK3_I_MIN <= x) { if ((double)DK3_I_MAX >= x) { back = (int)x; } else { back = DK3_I_MAX; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } else { back = DK3_I_MIN; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } return back; } unsigned dk3ma_d_to_u_ok(double x, int *ec) { unsigned back = 0U; if (0.0 <= x) { if ((double)DK3_U_MAX >= x) { back = (unsigned)x; } else { back = DK3_U_MAX; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } else { if (NULL != ec) { *ec = DK3_ERROR_MATH_OUT_OF_RANGE; } } return back; }