Обратите внимание, что ваш код может привести к переполнению целых чисел со знаком, которое не определено в стандарте.
Из стандарта C99 (§3.4.3 / 1)
Примером неопределенного поведения является поведение на целое число в течение потока
Так что я бы начал там, либо перешел бы к беззнаковому, использовал бы более широкий тип или изменил границы.
Также, как user6556709
упомянуто в комментарии, выражение:
(MCA_SIZE*(peak_val-PEAK_MIN)/(PEAK_MAX-PEAK_MIN))
Гарантируется, что будет выполнено, как если бы оно было написано следующим образом, из-за ассоциативности слева направо для этой группы операторов (обратите внимание на круглые скобки):
((MCA_SIZE*(peak_val-PEAK_MIN))/(PEAK_MAX-PEAK_MIN))
Таким образом, выражение (peak_val-PEAK_MIN)/(PEAK_MAX-PEAK_MIN)
, вычисляемое всегда с нуля, не выполняется, выражение (MCA_SIZE*(peak_val-PEAK_MIN))
выполняется ранее, так что это не главная проблема.
Я бы рекомендовал привести несколько примеров для peak_val
, в которых корзины не заполнены.