Здравствуйте, StatujaLeha, Вы писали:
SL>Здравствуйте, adontz, Вы писали:
A>>Здравствуйте, StatujaLeha, Вы писали:
A>>У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления. A>>Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.
SL>я проверил по-другому: подобрал данные небольшие по величине и подал их на вход программы. Данные были подобраны так, чтобы один из вычисляемых параметров должен был обратится в ноль. Здесь я отловил одну свою ошибку в реализации, но ее исправление не улучшило точность до необходимой, погрешность только при вычислении промежуточного параметра составляет 0.1903. Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?
Почитай численные методы.
Подсчитай обусловленность метода.
У машины из-за ограниченной разрядности операндов, есть нехорошая особенность, при каждом действии уменьшать кол-во значащих разрядов. Грубо можно описать так:
При умножении (на каждом) — теряется один значащий разряд. порядок чисел не важен.
При сложении важно, чтобы числа были одного порядка или максимально приближенные, иначе меньшее число на фоне большего может потеряться.
А как лечить? Или менять алгоритм, чтобы погрешность не успела накопиться, или повышать разрядность операндов. Но это приведет к тому, что все вычисления фактически будут считаться "столбиком" за сотню-другую шагов, что очень медленно. Если быстродействие не важно, то можно попробовать. Для прикидки скорости вычисления можно использовать математический пакет например Waterloo Maple. В нем разрядность операнда настраивается.
Однажды, я для повышения точности использовал такой метод:
Математический сопроцессор имеет не 64-битные регистры, а 80-битные. Все вычисления внутри себя он производит именно с этой точностью. Если все вычисления максимально проводить в регистрах сопроцессора, и выгружать из регистров в память только результаты, то можно съекономить несколько разрядов (иногда важных).
Но мне пришлось реализовывать все на ассемблере (про SSE/SSE2 тогда еще не знали .
У меня имеется геометрическая задача, теоретическое решение я уже придумал: оно достаточно обоснованное, проверенное и сомнений не вызывает. Его недостаток в том, что оно насыщено использованием функций sqrt,atan и tan. Аргументы этих функций у меня double. Теперь вопрос: сильно но ли это мжет повлиять на точность? Вопрос актуален для меня, т.к. на выходе нужна точность до сотых долей. Если это влияет на точность, то хотелось бы узнать какие-то методы улучшения ее до необходимого уровня.
Re: О точности вычислений при использовании double
У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления.
Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, StatujaLeha, Вы писали:
A>У вычислений насыщенных тригонометрическими функциями нередко проявляется особенность накапливать ошибку вычисления. A>Стабильносмть легко проверить, если вычисляемая функция гладкая, немного меняя аргумент.
я проверил по-другому: подобрал данные небольшие по величине и подал их на вход программы. Данные были подобраны так, чтобы один из вычисляемых параметров должен был обратится в ноль. Здесь я отловил одну свою ошибку в реализации, но ее исправление не улучшило точность до необходимой, погрешность только при вычислении промежуточного параметра составляет 0.1903. Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?
Re[3]: О точности вычислений при использовании double
Здравствуйте, StatujaLeha, Вы писали:
SL>Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?
Боюсь здесь тот случай, когда от перестановки мест слагаемых меняется сумма. Можно потасовать их на удачу.
Хотя конечно избавиться от тригонометрических функций лучше.
Ну и как вариант http://www.rsdn.ru/Forum/?mid=210497
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, StatujaLeha, Вы писали:
SL>>Вопрос теперь в следующем, есть ли возможность повысить точность вычислений или надо искать решение без необходимости использовать тригонометрические и степенные функции?
A>Боюсь здесь тот случай, когда от перестановки мест слагаемых меняется сумма. Можно потасовать их на удачу. A>Хотя конечно избавиться от тригонометрических функций лучше. A>Ну и как вариант http://www.rsdn.ru/Forum/?mid=210497
Здравствуйте, Ban001, Вы писали:
B>Почитай численные методы.
во втором семестре у нас начнется курс.
B>Подсчитай обусловленность метода. B>У машины из-за ограниченной разрядности операндов, есть нехорошая особенность, при каждом действии уменьшать кол-во значащих разрядов. Грубо можно описать так: B>При умножении (на каждом) — теряется один значащий разряд. порядок чисел не важен. B>При сложении важно, чтобы числа были одного порядка или максимально приближенные, иначе меньшее число на фоне большего может потеряться.
B>А как лечить? Или менять алгоритм, чтобы погрешность не успела накопиться, или повышать разрядность операндов. Но это приведет к тому, что все вычисления фактически будут считаться "столбиком" за сотню-другую шагов, что очень медленно. Если быстродействие не важно, то можно попробовать. Для прикидки скорости вычисления можно использовать математический пакет например Waterloo Maple. В нем разрядность операнда настраивается.
пошаманил с формулами тригонометрическими и заработало