15static inline float rescale_float(
22 float input_range = input_max - input_min;
23 float output_range = output_max - output_min;
25 if (input_range == 0.0f)
return output_min;
27 float ratio = (input - input_min) / input_range;
28 float output = output_min + (ratio * output_range);
34static inline signed int rescale_signed(
38 signed int output_min,
41 float output = rescale_float(
49 return (
signed int)output;
53static inline unsigned int rescale_unsigned(
55 unsigned int input_min,
56 unsigned int input_max,
57 unsigned int output_min,
58 unsigned int output_max
60 float output = rescale_float(
68 return (
unsigned int)output;
71#define RESCALE(input, input_min, input_max, output_min, output_max) \
72 _Generic((input) + (input_min) + (input_max) + (output_min) + (output_max), \
73 signed int: rescale_signed, \
74 unsigned int: rescale_unsigned, \
75 float: rescale_float \
76)(input, input_min, input_max, output_min, output_max)