Существует ли более эффективный способ фиксации действительных чисел, чем использование операторов if или тройных операторов? Я хочу сделать это как для парных, так и для 32-битной реализации фиксированной точки (16.16). Я не запрашиваю код, который может обрабатывать оба случая; они будут обрабатываться в виде отдельных функций.
Очевидно, я могу сделать что-то вроде:
double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;
или
double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
clampedA = MY_MAX;
else if(clampedA < MY_MIN)
clampedA = MY_MIN;
В версии с фиксированной точкой будут использоваться функции/макросы для сравнения.
Это делается в критичной для производительности части кода, поэтому я ищу как можно эффективный способ сделать это (что, как я подозреваю, будет включать манипуляции с битами)
EDIT: он должен быть стандартным/портативным C, функциональность платформы не представляет интереса здесь. Кроме того, MY_MIN
и MY_MAX
являются тем же типом, что и значение, которое я хочу зажать (удваивается в приведенных выше примерах).