Наивное решение - использовать два сравнения для нахождения минимума и два сравнения для нахождения максимума.Это неоптимально, поскольку достаточно трех сравнений (псевдокод, возвращающий (min, max) кортеж, следует):
function minmax(float a, float b, float c): (float, float)
begin
boolean altb = (a < b);
boolean bltc = (b < c);
if altb and bltc then return (a, c);
if not altb and not bltc then return (c, a);
if altb then // Also: c <= b, so b is known to be max
begin
if a < c then return (a, b);
return (c, b);
end
if bltc then // Also: b <= a, so b is known to be min
begin
if a < c then return (b, c);
return (b, a);
end
// Unreachable.
end
(это написано, чтобы быть наиболее читабельным, а не минимизировать количество ветвей)
Это выполняет от 2 до 3 сравнений.Невозможно использовать только 2 сравнения, так как их 3!= 6 переупорядочений 3 поплавков и 2 сравнения могут различать только 4 различных.Это легко увидеть в дереве решений проблемы.
На практике следует полагаться на оптимизации, подобные этой, на компиляторе.