Цитата:
так как фактически в проверке условия a*b < 0 компьютер проверяет только знаки сомножителей.
Думаю, это зависит от компилятора. Лично мне не хотелось бы писать компиляторозависимый код. Чтобы не было потом мучительно больно искать ошибку в многокоде. Тем более это базовый сущности, которые будут использоваться буквально в каждой последующей строке кода.
Провёл небольшой тест:
Код:
// const MinSingle   =  1.4012984643248170709e-45;
// const MinExtended = 3.64519953188247460253e-4951;
// константы взяты из системного модуля Math, и вынесены сюда для наглядности
var sx,sy:single; // 32bit аналог float в Си
      ex,ey:extended; // 80bit аналога на Си не знаю
begin
  sx := MinSingle;
  sy := MinSignle;
  ShowMessage( BoolToStr( sy*sx<0 ) );// вернуло 0 - верно
  sx := -MinSingle;
  ShowMessage( BoolToStr( sy*sx<0 ) );// вернуло -1 - верно
// потом я вспомнил что в Delphi все операции с плавающей точкой преобразуются в тип Extended
// решил проверить как там дела обстоят
  ex := MinExtended;
  ey := MinExtended;
  ShowMessage( BoolToStr( ey*ex<0 ) );// вернуло 0 - верно
  ex := -MinExtended;
  ShowMessage( BoolToStr( ey*ex<0 ) );// вернуло 0 - НЕ верно
end;
Так что опасность не преувеличена.
Кстати, ф-ия 
Sign есть(век живи - век учись), внутри которой находится всё тот же 
ifКод:
function Sign(const AValue: Single): TValueSign;
begin
  if (PInteger(@AValue)^ and $7FFFFFFF) = $00000000 then
    Result := ZeroValue
  else
    if (PInteger(@AValue)^ and $80000000) = $80000000 then
      Result := NegativeValue
    else
      Result := PositiveValue;
end;
Посмотрев на 
Sign мне захотелось оставить свой 
if.
Цитата:
По трем ребрам (векторам), выходящим из одной вершины параллелепипеда, этот пипед восстанавливается однозначно.
Ну теперь всё встало на свои места. Спасибо!