Цитата:
так как фактически в проверке условия 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.
Цитата:
По трем ребрам (векторам), выходящим из одной вершины параллелепипеда, этот пипед восстанавливается однозначно.
Ну теперь всё встало на свои места. Спасибо!