Здравствуйте, McSeem2, Вы писали:
MS>Нет, как раз точность теряется при преобразовании double -> float, что вполне естественно и ожидаемо. Все значения во Float — это "реальность, данная нам в ощущениях", то есть, другого у нас нет. Но нахождение среднего не сбоит — результат получается в точности такой же, как и в вычислениях с double, если мы берем исходные данные из float (xb1... взяты из x1...). То есть, формула (a+b)/2 в данном случае работает точно. Более того, мы можем выпролнять эти пополамные деления многократно без потери точности.
Да, согласен, был неправ. (a+b)/2 действительно работает точно.
Если считать по формуле a * x1 + (1 — a) * x2, то изменение в последнем знаке мантиссы a очень сильно влияет на результат. Точности float в том случае не хватает.
Здравствуйте, McSeem2, Вы писали: MS>Проблема в том, что вычисления происходят на пределе числовой стабильности. Отрезки очень длинные, а расстояние (X2,Y2)->(X3,Y3) очень маленькое. В результате, вычисленная координата X может оказаться больше X3, хотя абсолютной точности представления в районе X,X3 все еще вполне достаточно. MS>Как бы так преобразовать выражение, учитывая специфику операций с плавающей точкой, чтобы на данном рисунке вычисленная X никогда не получалась больше X3?
Ну, в таком случае ведь можно посчитать и "наоборот", т.е. плясать от X2:
X= X2-K*(Y3-Y2).
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Более того, если точка близка к середине, я просто выполняю одно деление пополам. Это со всеми проверками хоть и накладно, но еще приемлемо.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Случай с числовой стабильностью
От:
Аноним
Дата:
16.02.06 06:30
Оценка:
Здравствуйте, McSeem2, Вы писали:
MS>Есть два отрезка на плоскости, (X1,Y1)->(X2,Y2) и (X3,Y3)->(X4,Y4). Собственно, нас интересует точка (X3,Y3). Надо на первом отрезке вычислить координату X, соответствующую координате Y3. MS>
MS>Ну это элементарная пропорция: MS>
MS>Проблема в том, что вычисления происходят на пределе числовой стабильности. Отрезки очень длинные, а расстояние (X2,Y2)->(X3,Y3) очень маленькое. В результате, вычисленная координата X может оказаться больше X3, хотя абсолютной точности представления в районе X,X3 все еще вполне достаточно. MS>Как бы так преобразовать выражение, учитывая специфику операций с плавающей точкой, чтобы на данном рисунке вычисленная X никогда не получалась больше X3?
На рисунке ниже приведена линия и обозначен пунктиром коридор точности задания положения этой линии. Любые вычисления дадут результат в пределах ширины коридора точности. Ширина коридора точности, в пределах которого плавает линия, пропорциональна абсолютным значениям координат точек (x1, y1) и (x2, y2). Так как значения координат большие то и коридор точности широк. Значит, погрешность вычислений будет большая.
На рисунке ниже приведена линия и обозначен пунктиром коридор точности задания положения этой линии. Любые вычисления дадут результат в пределах ширины коридора точности. Ширина коридора точности, в пределах которого плавает линия, пропорциональна абсолютным значениям координат точек (x1, y1) и (x2, y2). Так как значения координат большие то и коридор точности широк. Значит, погрешность вычислений будет большая.
Здравствуйте, KW_, Вы писали:
KW_>На рисунке ниже приведена линия и обозначен пунктиром коридор точности задания положения этой линии. Любые вычисления дадут результат в пределах ширины коридора точности. Ширина коридора точности, в пределах которого плавает линия, пропорциональна абсолютным значениям координат точек (x1, y1) и (x2, y2). Так как значения координат большие то и коридор точности широк. Значит, погрешность вычислений будет большая.
В том-то и дело, что во многих случаях можно достичь большего. Например, мы увеличиваем некий фрагмент в 100 миллионов раз. Понятно, что конечные точки начинают при этом "скакать". Но я хочу чтобы и вычисленная точка на отрезке "скакала" вместе с ним. Эта точка — видима в окне с размерами порядка тысячи. А в этих пределах числа имеют очень даже хорошую точность. Иными словами, "коридор точности" выглядит примерно так: