В DELPHI - если ваш домен представляет собой целые числа, и если вы можете поместить свои аргументы в longints, и если вы можете избежать передачи минимального целого числа ($ 80000000), то это даст вам желаемый результат без каких-либо условных переходов :
function cmMinInt( XX, YY, ZZ : longint ) : longint;
begin
result := max(0,longint(
min(longint((XX-1) xor $80000000),
min(longint((YY-1) xor $80000000),
longint((ZZ-1) xor $80000000)
)) xor $80000000)+1);
end;
Техника зависит от обратимого преобразования без потерь типа longint, так что интересующий нас диапазон - целые числа от 1 до MAXINT - остается в порядке и занимает самые низкие значения. Простое переключение знакового бита почти дает то, что нам нужно, за исключением того, что мы не хотим, чтобы 0 входил в нижний диапазон. Вычитание 1 сначала (и добавление его позже) исправляет это. Используемая здесь операция xor расширяет оба операнда до int64, что требует явного приведения обратно к longint, поэтому функция min выдаст правильный результат. Наконец, если все операнды отрицательны, минимум будет найден в верхнем диапазоне, а ответ будет отрицательным. В этом случае мы хотим, чтобы ответ был 0, поэтому мы просто обрезаем его с помощью функции max.
Вот одна и та же математика, разбросанная по нескольким утверждениям для более удобного чтения:
function cmMinInt( XX, YY, ZZ : longint ) : longint;
begin
// swap ordinal coding for range MININT..0 with range 1..MAXINT
XX := XX-1; // move region division to between 0 and 1
XX := XX xor $80000000; // swap regions, preserving ordering
XX := longint(XX); // cram back into signed 32-bit
// similarly with YY and ZZ
YY := longint((YY-1) xor $80000000);
ZZ := longint((ZZ-1) xor $80000000);
// find min of three recoded values
result := min(XX,min(YY,ZZ));
// swap ordering back again
result := result xor $80000000; // swap regions, preserving ordering
result := result+1; // move region division back home
result := longint(result); // cram back into signed 32-bit
// if all three were neg, result at this point is neg -- clip to zero
result := max(0,result);
end;
-Аль.