2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение04.08.2009, 20:48 
Заслуженный участник


15/05/09
1563
ewert в сообщении #232947 писал(а):
Только надо всё ж таки отдавать себе отчёт в том, что конкретныя языки тут не при чём. Если есть погрешность округления -- так она и есть. И никакое языкознание тут не спасёт. Увы.
Это точно. Языкознание в лучшем случае поможет написать более эффективную программу, хотя для этих целей наверное лучше подходят библиотеки, оптимизированные годами и профессионалами.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение04.08.2009, 23:52 


27/08/06
579
ewert в сообщении #232947 писал(а):
Только надо всё ж таки отдавать себе отчёт в том, что конкретныя языки тут не при чём. Если есть погрешность округления -- так она и есть. И никакое языкознание тут не спасёт. Увы.

По крайней мере в одном члене я от погрешности избавлюсь.
А это важно.Рассмотрим например уже приведённую систему.
$5x+3y+4z=1$
$0.000000000001x+y-2z=3$
Как найти её ФСР в этом случае? А если я грохну коэфициент во второй строчке при $x$ - то найти ФСР уже просто. Вот здесь мне уже и понадобится функция округления.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 11:08 
Заслуженный участник


11/05/08
32166
Dialectic в сообщении #232981 писал(а):
Как найти её ФСР в этом случае?

Подумаешь, бином Ньютона:
$$\begin{cases}
5.000000000000000\; x + 3.000000000000000\; y + 4.000000000000000\; z = 1.000000000000000 \\
0.000000000001000\; x + 1.000000000000000\; y - 2.000000000000000\; z = 3.000000000000000
\end{cases}$$
$$\begin{cases}
5.000000000000000\; x + 3.000000000000000\; y + 4.000000000000000\; z = 1.000000000000000 \\
0.999999999999400\; y - 2.000000000000800\; z = 2.999999999999800
\end{cases}$$
$$\begin{cases}
5.000000000000000\; x + 10.000000000006000\; z = -8.000000000004800 \\
0.999999999999400\; y - 2.000000000000800\; z = 2.999999999999800
\end{cases}$$
$$\begin{cases}
x + 2.000000000001200\; z = -1.600000000000960 \\
y - 2.000000000002000\; z = 3.000000000001600
\end{cases}$$
$$\begin{cases}
x = - 2.000000000001200\; z - 1.600000000000960 \\
y =  2.000000000002000\; z + 3.000000000001600
\end{cases}$$
(что, кстати, не называется ФСР)

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 13:09 


27/08/06
579
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза. На первом шаге мы получаем некую "почти равносильную" матрицу, на втором - обнуляем коэфициенты окончательно. Я всё-таки пологаю, что округлить будет гораздо быстрее... А потом - лихо же Вы добавили разрядов в число, забыв, что у нас все типы имеют жестко фиксированные размеры.

Цитата:
(что, кстати, не называется ФСР)

То, что получилось в результате у Вас - действительно не является ФСР. А я реализую алгоритм, который
выдаёт на выходе ортонормированную систему векторов образующую собой базис пространства решений.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 13:47 
Заслуженный участник


11/05/08
32166
Dialectic в сообщении #233039 писал(а):
ортонормированную систему векторов образующую собой базис пространства решений.

Система неоднородна, поэтому у неё нет "базиса". Термин "фундаментальная система решений" принято использовать только для однородных задач.

Dialectic в сообщении #233039 писал(а):
лихо же Вы добавили разрядов в число, забыв, что у нас все типы имеют жестко фиксированные размеры.

А он и есть фиксированный: 15-16 значащих цифр -- это стандартный формат double. А добавил я их намеренно -- чтобы продемонстрировать Вам погрешность, вносимую Вами огруглением до 12-ти разрядов.

Dialectic в сообщении #233039 писал(а):
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза.

Какие ещё два? Это -- стандартный метод Гаусса (Вы ж его хотели), другого и не бывает. Разве что диагональные элементы нормируются в самом конце (по стандарту -- на каждом шаге). Но это сделано лишь для наглядности, и никакой роли не играет.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 14:59 


27/08/06
579
ewert в сообщении #233053 писал(а):
Dialectic в сообщении #233039 писал(а):
ортонормированную систему векторов образующую собой базис пространства решений.

Система неоднородна, поэтому у неё нет "базиса". Термин "фундаментальная система решений" принято использовать только для однородных задач.

Виноват. Подзабыл уже определения. Мы естественно ищем базис соответствующей однородной системы+ частное решение неоднородной.

ewert в сообщении #233053 писал(а):
Dialectic в сообщении #233039 писал(а):
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза.

Какие ещё два? Это -- стандартный метод Гаусса (Вы ж его хотели), другого и не бывает. Разве что диагональные элементы нормируются в самом конце (по стандарту -- на каждом шаге). Но это сделано лишь для наглядности, и никакой роли не играет.

Стандартный это когда используется метод прямой и обратной прогонки.Но насколько я понял - Вы предлагаете сделать два раза прямую и два раза обратную прогонку.
Вот Вам система:
$3x+2y-z=2$
$7x-2x+3z=3$
- продемонстрируйте пожалуйста, как Вы собираетесь обнулить коэфициент при x не прибегая к округлению и двойному проходу в "один конец"?

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 15:18 
Заслуженный участник


11/05/08
32166
Надо полагать, имелось всё же в виду
$\begin{cases}3x+2y-z=2 \\ 7x-2y+3z=3\end{cases}$.
Пожалуйста, канонический алгоритм:
$\begin{cases}x+{2\over3}y-{1\over3}z={2\over3} \\ -{20\over3}y+{16\over3}z=-{5\over3}\end{cases}$
$\begin{cases}x+{1\over5}z={1\over2} \\ y-{4\over5}z={1\over4}\end{cases}$
Первая система -- это результат первого шага, вторая -- второго (если интерпретировать это как метод Гаусса без обратного хода). Или, если угодно: первая -- это первый (и последний) шаг прямого хода, вторая -- единственный шаг обратного.

Как-то я всё никак не пойму, чего Вы хотите.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 16:03 


27/08/06
579
ewert в сообщении #233098 писал(а):
Надо полагать, имелось всё же в виду
$\begin{cases}3x+2y-z=2 \\ 7x-2y+3z=3\end{cases}$.
Пожалуйста, канонический алгоритм:
$\begin{cases}x+{2\over3}y-{1\over3}z={2\over3} \\ -{20\over3}y+{16\over3}z=-{5\over3}\end{cases}$
$\begin{cases}x+{1\over5}z={1\over2} \\ y-{4\over5}z={1\over4}\end{cases}$
Первая система -- это результат первого шага, вторая -- второго (если интерпретировать это как метод Гаусса без обратного хода). Или, если угодно: первая -- это первый (и последний) шаг прямого хода, вторая -- единственный шаг обратного.


То что Вы тут продемонстрировали, разумеется правильно. Но только как указывалось
ещё EtCetera - для проведения таких вычислений -необходимо иметь специальный класс работающий с рациональными числами. А вообще, тема давно уже исчерпана. Всем спасибо за помощь и участие.

 Профиль  
                  
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 17:12 
Заблокирован
Аватара пользователя


13/01/09

335
Dialectic писал(а):
А вообще, тема давно уже исчерпана.

Только не для Вас. Чтобы рассеять сумбур, царящий в Вашей голове, советую почитать классику: например, Уилкинсона "Алгебраическая проблема собственных значений" - 4-ую главу.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group