2009-05-27 2 views
3

Я хотел бы знать, есть ли способ повысить точность вычисления наклона. (Это произошло несколько месяцев назад here).Rejigging уравнение с плавающей точкой

Кажется, изменяя:

float get_slope(float dXa, float dXb, float dYa, float dYb) { 
    return (dXa - dXb)/(dYa - dYb); 
} 

в

float get_slope(float dXa, float dXb, float dYa, float dYb) { 
    return dXa/(dYa - dYb) - dXb/(dYa - dYb); 
} 

может быть улучшение. Предложения?

Редактировать: Точность, которую я добиваюсь, а не эффективность.

+0

На каком языке вы используете? –

+1

C. Но мне любопытно, как это может квалифицировать ответы людей. – Jamie

+0

Кроме того: числа с плавающей точкой действительно странные. Чем ближе вы к нулю, тем больше точность вы получите. Под этим я подразумеваю, что поплавки могут представлять гораздо больше значений в диапазоне [0,0.1], чем в диапазоне [0,9,1]. Многие процессоры перейдут в «денормальный» режим около нуля. Некоторое время некоторые чипы Intel так резко сокращались, что имели дело с денонсациями, которые «денормальные всплески» появились в приложениях обработки сигналов (особенно в фильтрах LP), и люди рекомендовали AMD для обработки звука. Люди фактически добавили небольшое количество шума вблизи нуля, чтобы закодировать вокруг медленности. – Nosredna

ответ

1

У меня есть опечатка. Вероятно, вы имеете в виду

return dXa/(dYa - dYb) - dXb/(dYa - dYb); 

Я бы сказал, что первая форма, которую вы дали, имеет более высокую точность. Если dXa и dXb близки и велики, то вы потеряете точность в двух делениях до вычитания.

+0

«Закрыть и большой»: я не вижу, как «большая» часть вносит свой вклад в ваш аргумент. Если dX близки, разница между ними будет мала независимо от величины. Я имею в виду, это точка зрения, верно? – Jamie

5

Отдайте их double внутри функции.


Если вы столкнулись с проблемой, то, когда знаменатель близок к нулю, очевидно. Ваш склон приблизится к бесконечности. Поэтому многое зависит от того, что вы хотите сделать с наклоном. Иногда, если вы знаете, что ваша дельта y будет близка к нулю, вы можете рассчитать взаимный наклон и использовать это вместо этого. Вы даже можете определить, что меньше - абсолютное значение deltax или deltay и вернуть наклон или 1/наклон. Также загляните в atan2().


Если вы знаете, что вход в десятичной системе, и вы хотите, выход в десятичной системе счисления, а также, вы можете преодолеть потерю точности, которая присуща в преобразовании поплавки в двоичную и обратно, выполнив все вычисления с десятичной библиотека. Я помню, как мне понравилось, когда я использовал Atari BASIC для десятичных вычислений, поскольку он использовал режим BCD 6502.

+0

Подразделение почти нулевое - все в порядке; если в результате были + INF или -INF, это тоже нормально: я хотел бы знать, находится ли наклон прямо вверх и вниз. – Jamie

+0

Я хочу сказать, что это действительно зависит от того, что вы собираетесь делать с наклоном. Если вы выполняете расчет с наклоном, это может помочь вывести расчет наклона из функции и вставить его в уравнение, которое использует наклон. Затем вы можете взглянуть на уравнение в целом на точность задач. – Nosredna

1

Если вы не возражаете, чтобы сжечь некоторые дополнительные циклы, вы можете получить лучшую точность, выполнив цикл.

Вычислить наклон отрезка между А и В.

Вычислить наклон отрезка между {(Xa - (Ха -Xb)), (Ya - (Я. -Yb)} и {(Xb + (Xa - Xb)), (Yb + (Ya - Yb))} ... В основном A - наклон и наклон B +

Затем сравните результирующие наклоны. Если разница слишком велика (выберите пороговое значение вы хотите), затем продолжайте движение и усредните все наклоны в конце.

Это может помочь сгладить аномалии, вызванные арифметикой с плавающей запятой, для очень маленьких склонов.

+0

Интригуя, и я в конечном итоге делаю это, это не тот «ответ», который я искал. Это скорее алгоритмическое решение, чем простое «перекодирование». – Jamie

+0

Ну, вы спросили: «Я хотел бы знать, есть ли способ повысить точность вычисления наклона». К сожалению, ответ заключается не в использовании трюков и, может быть, в том, что он может удвоиться, как предлагает Носредна. – patros

Смежные вопросы