%% options copyright owner = Dirk Krause copyright year = 2014 license = bsd %% header /** @file dk3madsc.h Conversion from double to short and unsigned short. */ #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 short. @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. */ short dk3ma_d_to_s_ok(double x, int *ec); /** Convert double value to unsigned short. @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 short dk3ma_d_to_us_ok(double x, int *ec); #ifdef __cplusplus } #endif %% module #include "dk3ma.h" $!trace-include short dk3ma_d_to_s_ok(double x, int *ec) { short back = 0; if ((double)DK3_S_MIN <= x) { if ((double)DK3_S_MAX >= x) { back = (short)x; } else { back = DK3_S_MAX; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } else { back = DK3_S_MIN; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } return back; } unsigned short dk3ma_d_to_us_ok(double x, int *ec) { unsigned short back = 0U; if (0.0 <= x) { if ((double)DK3_US_MAX >= x) { back = (unsigned short)x; } else { back = DK3_US_MAX; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } else { if (NULL != ec) { *ec = DK3_ERROR_MATH_OUT_OF_RANGE; } } return back; }