lqp - Вопрос к залу - вычислительное
[Recent Entries][Archive][Friends][User Info]
02:07 pm
[Link] |
Вопрос к залу - вычислительное Что-то туплю, не могу решить задачку.
Есть два вектора X и X'=X+dX, X >>> dX. Для понимания |X| это примерно сотни километров, |dX| - миллиметры. Надо найти |X|-|X'| с максимально возможной точностью.
У нас есть несколько формул, которые, есть основания полагать, дадут лучший результат, чем лобовой подход. Однако их сравнительная точность зависит от разрядности данных, архитектуры процессора, математической библиотеки и прочих обстоятельств от нас скрытых, так что сравнить аналитически не получится.
Задача - как-то оценить численно погрешность различных формул. Если не на всем пространстве аргументов, то хотя бы на паре-тройке тестовых примеров. Проблема в том, что если рассчитывать тестовые примеры на том же самом компьютере (или вообще - на цифровом компьютере), то они тоже будут иметь погрешности, причем вполне вероятно - в ту же самую сторону. Так что нужны примеры, которые легко рассчитываются аналитически до чисел. В качестве послабления я готов принять, что вычисление одной элементарной функции/арифметической операции на невырожденных аргументах - точно. Ну пусть двух, но это максимум. Или нужен какой-то другой подход.
Tags: вопрос
|
|
|
From: | (Anonymous) |
Date: | August 4th, 2015 - 01:32 pm |
---|
| | | (Link) |
|
в коробочку пидараса
From: | (Anonymous) |
Date: | August 4th, 2015 - 01:40 pm |
---|
| | | (Link) |
|
Слышь ты, математишка жалкий. уёбывай со своими формулами.
>вычисление одной элементарной функции/арифметической операции на невырожденных аргументах Совсем ебанутый дебил, ахуеть.
From: | (Anonymous) |
Date: | August 4th, 2015 - 01:49 pm |
---|
| | | (Link) |
|
Надо помолиться.
From: | (Anonymous) |
Date: | August 4th, 2015 - 02:00 pm |
---|
| | | (Link) |
|
ща помолимся в жопу подолбимся
> так что сравнить аналитически не получится.
Хрень какая-то. Мне такое непредставимо, да.
В общем, похожэ, как-то неправильно сформулирована задача, и ты хочешь что-то, чего я не увидел за этой формулировкой.
From: | lqp |
Date: | August 4th, 2015 - 02:40 pm |
---|
| | | (Link) |
|
Ну смотри. Пусть X=(x,y), dX=(dx,dy)
Считать нам по формуле
dl=dx*x/|X|+dy*y/|X|
или по формуле a=atan2(y,x), dl=dx*sin(a)+dy*cos(a)
зависит от того, насколько хороша у нас тригонометрия. Может оказаться что по второй будет точнее, хоть там и лишнее преобразование.
Иииии ... может это физически и возможно, но я не возьмусь проверять качество математической библиотеки, и высчитывать ее погрешность.
Тригонометрия на аппаратной плавучке, насколько я помню, даёт точный результат. В смысле -- в пределах точности представления числа.
Учитывая, что у тебя в первом случае ещё и два умножэния... То дажэ без учёта, что первая формула -- приближённая, второй явно лучшэ.
From: | (Anonymous) |
Date: | August 4th, 2015 - 02:21 pm |
---|
| | | (Link) |
|
проблема уровня школьной тригонометрии удачную картинку нарисовать и выбрать несколько примеров
From: | lqp |
Date: | August 4th, 2015 - 02:27 pm |
---|
| | | (Link) |
|
Да нет проблем. Примеров у меня есть уже с десяток. Вопрос в том, какие из них будут лучше.
From: | (Anonymous) |
Date: | August 4th, 2015 - 02:37 pm |
---|
| | | (Link) |
|
зависит от ваших формул и исходной задачи
Ну и да, банальное: возьми bc и установи ему scale так побольшэ. Ну, учитывая, что каждая операцыя откусывает где-то по одной двоичной цыфре scale -- посчитай просто количество операцый, и добавь столько десятичных цыфр, по сравнению с точностью твоих чисел.
From: | lqp |
Date: | August 4th, 2015 - 02:44 pm |
---|
| | | (Link) |
|
Ну да, я как-то тоже склоняюсь к тому чтобы взять какой-нибудь bignum с квадриллионом значащих цифр и в нем посчитать. Но я подозреваю, что от проблем с тригонометрией это все равно не спасет.
From: | (Anonymous) |
Date: | August 4th, 2015 - 02:54 pm |
---|
| | | (Link) |
|
простите за тупость, а разложение в ряд и оценка руками не спасает от таких проблем?
Спасёт. Я bc как-то проверял, как он pi считает ( a(1)*4 ) -- отлично считает, чо, десятка тысяч знаков дажэ реально дождаться.
И вообще -- если так боишься, то считай без тригонометрии, тебе жэ примеры нужны.
в ряд разложить же если координаты X х_1, ..., х_n, а dX = d_1, ..., d_n то |X+dX|^2= \sum x_i^2+\sum d_i^2 + 2 \sum x_i d_i кладем A=|Х|, B= A^{-2}(\sum d_i^2 + 2 \sum x_i d_i) получаем |X+dX|-|Х|=A*(1+B)^{1/2} раскладываем в ряд по B, которое величина чрезвычайно маленькая по условию (порядка 10^{-8}). 2-3 значимых членов уже достаточно разложение в ряд для (1+B)^{1/2} есть например тут https://en.wikipedia.org/wiki/Square_rootПривет
очепятался вместо |X+dX|-|Х|=A*(1+B)^{1/2} надо |X+dX|-|Х|=A*(1+B)^{1/2} -А
From: | (Anonymous) |
Date: | August 4th, 2015 - 04:27 pm |
---|
| | | (Link) |
|
гавна поешь, клоун
From: | (Anonymous) |
Date: | August 4th, 2015 - 03:35 pm |
---|
| | | (Link) |
|
Vam neizvestno o sustchestvovanii bibliotek dlya vychisleniya s neogranichennym chislom razryadov? I kompyuternyh programm vysokogo urovnya kotorye ih ispolzuyut?
Postaviv biblioteku, pishete svoyu programmu/skript Zapustiv programmu vysokogo urovnya, berete i schitaete v nej to, chto van nuzhno.
Naprimer, samaya izvestnaya otkrytaya programma simvolnyh vychislenij osnovana na bibliotekah s proizvolnoj tochnostyu. Vy zadaete tochnost komandoj, zatem schitaete kak na kalkulatore.
Если сделать анализ ошибок не хватает знаний или времени, то не меньший авторитет, чем Вильям Кахан, рекомендует считать с расширенной точностью, а также менять аппаратный флаг направления округления ( к ближайшему целому, к нулю, к бесконечности) и сравнивать результаты. А вообще-то динамический диапазон не такой большой DX/X ~ 10^-8 , половина диапазона двойной точности плавающей точки double. При этом встроенные тригонометрические функции должны давать ошибку не больше бита последнего разряда мантисс, а арифметические операции - половину бита последнего разряда. Наконец, библиотеки типа mpmath имеют встроенные тригонометрические и спецфункции произвольной точности
| | Оценка разницы длин | (Link) |
|
|
|