Re[3]: О точности вычислений при использовании double
От: Ban001  
Дата: 07.09.05 15:56
Оценка: 12 (2)
Здравствуйте, StatujaLeha, Вы писали:

SL>Здравствуйте, adontz, Вы писали:


A>>Здравствуйте, StatujaLeha, Вы писали:


A>>У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления.

A>>Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.

SL>я проверил по-другому: подобрал данные небольшие по величине и подал их на вход программы. Данные были подобраны так, чтобы один из вычисляемых параметров должен был обратится в ноль. Здесь я отловил одну свою ошибку в реализации, но ее исправление не улучшило точность до необходимой, погрешность только при вычислении промежуточного параметра составляет 0.1903. Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?



Почитай численные методы.
Подсчитай обусловленность метода.
У машины из-за ограниченной разрядности операндов, есть нехорошая особенность, при каждом действии уменьшать кол-во значащих разрядов. Грубо можно описать так:
При умножении (на каждом) — теряется один значащий разряд. порядок чисел не важен.
При сложении важно, чтобы числа были одного порядка или максимально приближенные, иначе меньшее число на фоне большего может потеряться.

А как лечить? Или менять алгоритм, чтобы погрешность не успела накопиться, или повышать разрядность операндов. Но это приведет к тому, что все вычисления фактически будут считаться "столбиком" за сотню-другую шагов, что очень медленно. Если быстродействие не важно, то можно попробовать. Для прикидки скорости вычисления можно использовать математический пакет например Waterloo Maple. В нем разрядность операнда настраивается.


Однажды, я для повышения точности использовал такой метод:
Математический сопроцессор имеет не 64-битные регистры, а 80-битные. Все вычисления внутри себя он производит именно с этой точностью. Если все вычисления максимально проводить в регистрах сопроцессора, и выгружать из регистров в память только результаты, то можно съекономить несколько разрядов (иногда важных).
Но мне пришлось реализовывать все на ассемблере (про SSE/SSE2 тогда еще не знали .
... << RSDN@Home 1.1.3 stable >>
О точности вычислений при использовании double
От: StatujaLeha на правах ИМХО
Дата: 09.06.05 19:03
Оценка:
Доброго времени суток.

У меня имеется геометрическая задача, теоретическое решение я уже придумал: оно достаточно обоснованное, проверенное и сомнений не вызывает. Его недостаток в том, что оно насыщено использованием функций sqrt,atan и tan. Аргументы этих функций у меня double. Теперь вопрос: сильно но ли это мжет повлиять на точность? Вопрос актуален для меня, т.к. на выходе нужна точность до сотых долей. Если это влияет на точность, то хотелось бы узнать какие-то методы улучшения ее до необходимого уровня.
Re: О точности вычислений при использовании double
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.06.05 19:33
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления.
Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: О точности вычислений при использовании double
От: StatujaLeha на правах ИМХО
Дата: 10.06.05 09:10
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, StatujaLeha, Вы писали:


A>У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления.

A>Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.

я проверил по-другому: подобрал данные небольшие по величине и подал их на вход программы. Данные были подобраны так, чтобы один из вычисляемых параметров должен был обратится в ноль. Здесь я отловил одну свою ошибку в реализации, но ее исправление не улучшило точность до необходимой, погрешность только при вычислении промежуточного параметра составляет 0.1903. Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?
Re[3]: О точности вычислений при использовании double
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.06.05 13:06
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?


Боюсь здесь тот случай, когда от перестановки мест слагаемых меняется сумма. Можно потасовать их на удачу.
Хотя конечно избавиться от тригонометрических функций лучше.
Ну и как вариант http://www.rsdn.ru/Forum/?mid=210497
Автор: adontz
Дата: 09.03.03
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: О точности вычислений при использовании double
От: StatujaLeha на правах ИМХО
Дата: 10.06.05 13:30
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, StatujaLeha, Вы писали:


SL>>Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?


A>Боюсь здесь тот случай, когда от перестановки мест слагаемых меняется сумма. Можно потасовать их на удачу.

A>Хотя конечно избавиться от тригонометрических функций лучше.
A>Ну и как вариант http://www.rsdn.ru/Forum/?mid=210497
Автор: adontz
Дата: 09.03.03


эх, придеться опять придумывать что-нибудь... Спасибо за помощь.
Re[4]: О точности вычислений при использовании double
От: StatujaLeha на правах ИМХО
Дата: 08.09.05 06:36
Оценка:
Здравствуйте, Ban001, Вы писали:

B>Почитай численные методы.


во втором семестре у нас начнется курс.

B>Подсчитай обусловленность метода.

B>У машины из-за ограниченной разрядности операндов, есть нехорошая особенность, при каждом действии уменьшать кол-во значащих разрядов. Грубо можно описать так:
B>При умножении (на каждом) — теряется один значащий разряд. порядок чисел не важен.
B>При сложении важно, чтобы числа были одного порядка или максимально приближенные, иначе меньшее число на фоне большего может потеряться.

B>А как лечить? Или менять алгоритм, чтобы погрешность не успела накопиться, или повышать разрядность операндов. Но это приведет к тому, что все вычисления фактически будут считаться "столбиком" за сотню-другую шагов, что очень медленно. Если быстродействие не важно, то можно попробовать. Для прикидки скорости вычисления можно использовать математический пакет например Waterloo Maple. В нем разрядность операнда настраивается.


пошаманил с формулами тригонометрическими и заработало

спасибо за советы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.