2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




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

 
 
 
 Re: Попадает ли точка в треугольник на сфере
Сообщение31.10.2012, 22:00 
snake32 в сообщении #638269 писал(а):
Так что опасность не преувеличена.
Стандарт IEEE 754 о представлениях чисел с плавающей запятой определяет специальный «отрицательный ноль», который точно есть в 32- и 64-разрядных Single и Double. В Extended он тоже должен бы быть. Что выдаст Sign(ex * ey)?

-- Чт ноя 01, 2012 01:01:47 --

Простая проверка на равенство отрицательного и положительного нулей даст True.

 
 
 
 Re: Попадает ли точка в треугольник на сфере
Сообщение01.11.2012, 00:29 
Цитата:
Что выдаст Sign(ex * ey)?
Выдаёт 0, так как умножение минимально возможных величин ведёт к отсечению не поместившейся дробной части. Остаётся 0.
Код:
«отрицательный ноль»
да, я тоже думал что -0.0 < 0.0 однако это не так. вернёт false.

 
 
 
 Re: Попадает ли точка в треугольник на сфере
Сообщение01.11.2012, 00:49 
Изобретать можно разные частные случаи. Но конкретно в этой задачке вероятность неприятностей -- пренебрежимо мала.

А если вдруг нечаянно и случится -- то это будет лишь означать, что мы натолкнулись на ситуацию, в которой нахождение по ту или иную сторону плоскости сомнительно, в пределах погрешностей округлений. Такое возможно, конечно. Но в этом случае и выбор следует делать наугад.

 
 
 
 Re: Попадает ли точка в треугольник на сфере
Сообщение01.11.2012, 14:34 
snake32 в сообщении #638582 писал(а):
да, я тоже думал что -0.0 < 0.0 однако это не так. вернёт false.
Нет, по сравнению они и задуманы быть равными, но знак-то можно отдельно посмотреть. Странно, что он не сохранился при перемножении в этот раз — он же обрабатывается, по идее, отдельно от мантиссы без знака и порядка.

 
 
 [ Сообщений: 20 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group