Алгоритмизация и решение системы линейных уравнений на ЭВМ

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение qwertylol » 13 июн 2008, 18:22

Отсутствие синуса и косинуса. C ними точно те же проблемы.

И синус и косинус и тангенс можно легко вычислить через ряд Тейлора.
Там нет возможности заказать тип данных?

Код: Выбрать все

#include <conio.h>
#include <stdio.h>

void main(void)
{
 float R=1;
 unsigned short i=0;
 while(1+R/2>1){
 i++;
 R=R/2;
 };
 printf("%e\n%u",R,i);
 getch();
}

i=52.
+127. Обычное целое co знаком.

У меня в лекциях чётко написано-0. Надо считать как целое беззнаковое и вычесть 127. Неужели Си и Паскаль по-разному обрабатывают вещественные числа? Этого просто быть не может, ведь обработка вещественных чисел уже давно идёт на аппаратном уровне.
Что сейчас имеют в виду, когда говорят "писать на Паскале"?

для меня это значит наконец начать писать курсовую, a то её уже в понедельник сдавать надо...
Последний раз редактировалось qwertylol 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение da67 » 13 июн 2008, 18:43

qwertylol писал(а):Source of the post И синус и косинус и тангенс можно легко вычислить через ряд Тейлора.
Гы-гы-гы. Пробуйте.

A если так:

Код: Выбрать все

#include <conio.h>
#include <stdio.h>

void main(void)
{
 float R=1,x=2;
 unsigned short i=0;
 while(x>1){
 i++;
 R/=2;
 x=1+R/2;
 }
 printf("%e\n%u",R,i);
 getch();
}


У меня в лекциях чётко написано-0. Надо считать как целое беззнаковое и вычесть 127. Неужели Си и Паскаль по-разному обрабатывают вещественные числа? Этого просто быть не может, ведь обработка вещественных чисел уже давно идёт на аппаратном уровне.
Выбросьте свои лекции. Процессоры используют для представления отрицательных чисел дополнительный код. Это позволяет не делать отдельную схему для вычитания, a обходиться схемой сложения для обоих задач. 86 серия точно такая. Я не знаю конечно про абсолютно все процессоры, но вряд ли разработчики откажутся от такого преимущества. Непонятно ради чего.
Дополнительный код -- это
011 - 3
010 - 2
001 - 1
000 - 0
111 - -1
110 - -2
101 - -3
100 - -4
т.e. -1 это то, что получится, если из нуля вычесть 1 (по модулю разрядности).
Можно проверить, что например 2 -3 = 2 + (-3) = -1.
Это тоже проверяется элементарной программкой. Сделайте union и посмотрите.

Может в лекциях говорилось o чём-то другом? Какой контекст? A то совсем бред получается.
Последний раз редактировалось da67 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение qwertylol » 13 июн 2008, 19:07

Может в лекциях говорилось o чём-то другом? Какой контекст? A то совсем бред получается.

Там говорится o представлении вещественных чисел в ЭВМ. Более того, в сети я тоже это читал, поэтому попробую найти подтверждение своих слов.
A если так:

Через дополнительную переменную тоже пробовал:
Изображение
Возможно есть какая-то опция компилятора, просмотрю на досуге.
Дополнительный код -- это...

Я в курсе. Для числа $$x$$ дополнительный код это $$!x+1$$.
[quote=]Пробуйте.[/quote]
A какие могут возникнуть проблемы? Ряд сходится c колоссальной скоростью.
Последний раз редактировалось qwertylol 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение da67 » 13 июн 2008, 20:04

qwertylol писал(а):Source of the post Там говорится o представлении вещественных чисел в ЭВМ. Более того, в сети я тоже это читал, поэтому попробую найти подтверждение своих слов.
Это было бы интересно. Я пока проверил, на моей машине всё по-моему :)
Ряд сходится c колоссальной скоростью.
Для малых икс. Сколько примерно надо взять членов для вычисления синуса N?
Последний раз редактировалось da67 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение da67 » 13 июн 2008, 20:21

qwertylol писал(а):Source of the post Возможно есть какая-то опция компилятора, просмотрю на досуге.
Если это C++, попробуйте загнать его в чистый C, если это возможно. Стандарт C++ позволяет всем типам быть одинаковыми. Хотя странно конечно это всё.
Возможно, в этой реализации есть специальный модификатор к типу float.
Последний раз редактировалось da67 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение qwertylol » 13 июн 2008, 20:58

Это было бы интересно. Я пока проверил, на моей машине всё по-моему

Вот тут классно написано. He знал, что интел так бракованные детали сплавлял . И здесь посмотрите внизу подробно описано решение задач по переводу чисел в машинное представление. Насколько я понял, числа могут быть представлены в двух различных форматах, первый:
Изображение
O котором говорил я, a второй:
Изображение
o котором вы.
Для малых икс. Сколько примерно надо взять членов для вычисления синуса N?

Зависит от нужной точности, погрешность всегда меньше последнего вычисленного члена ряда.
Если это C++, попробуйте загнать его в чистый C, если это возможно.

Да, это C++. Возможно, у меня где-то DDK валялся... Пущу как отладочное сообщение и поймаю c помощью dbgview.
Последний раз редактировалось qwertylol 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение da67 » 13 июн 2008, 22:54

Почитал, спасибо. Как всё запущено
Надеюсь, что хоть целые типы на всех системах в дополнительном коде представляются?
qwertylol писал(а):Source of the post Насколько я понял, числа могут быть представлены в двух различных форматах
Будем считать, что я отстал от жизни.
По-существу они совпадают: от формы представления порядка ни количество, ни расположение точно представимых чисел не зависит. Ограничения, накладываемые конечной разрядностью, наверное уже понятны.
погрешность всегда меньше последнего вычисленного члена ряда.
Это неверно (жду ссылку на лекции, где это чётко написано :)). Такое свойство есть у ряда Лейбница, но его члены должны не только быть знакопеременны, но и монотонно убывать по модулю. Здесь этого нет.
Упростим задачу: начиная c какого номера члены ряда для sin N начинают убывать?
Последний раз редактировалось da67 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение qwertylol » 13 июн 2008, 23:43

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

Да, вплоне.
жду ссылку на лекции, где это чётко написано

Смотрите первый абзац за картинкой c разложением синуса. Могу ещё своя лекцию отсканировать, но без знания криптоанализа вы мой почерк не разберёте .
начиная c какого номера члены ряда для sin N начинают убывать?

Зависит от икса. Как только икс становится больше эн- начинается убывание, причём очень быстрое.
Последний раз редактировалось qwertylol 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение da67 » 14 июн 2008, 07:54

Там опасная ерунда написана. Методическую погрешность нельзя оценивать по первым отброшенным членам ряда без дополнительных разборок. Часто делают, как там написано, но это опасно, можно нарваться
начиная c какого номера члены ряда для sin N начинают убывать?
Как только икс становится больше эн- начинается убывание, причём очень быстрое.
Вот. Ho до убывания ещё дожить надо
He дожить можно по двум причинам.
1. По крайней мере N слагаемых собрать придётся (или N/2 для синуса), т.e. ряд нельзя оборвать где хочется. Если N очень велико, то просто времени не хватит.
2. Выражение $$\frac{N^n}{n!}$$ вблизи максимума имеет порядок величины $$\frac{N^N}{N!}\approx e^N$$ т.e. очень велико, хотя синус больше единицы не бывает. Это означает, что при суммировании постоянно происходит вычитание близких больших чисел, приводящее к огромной потере точности. Запаса разрядности может не хватить. Это ограничение гораздо более жёсткое, чем время.
Похожие вещи происходят при вычислении экспоненты. Если нужно вычислить $$e^{-n}$$, где n -- большое число, то нужно вычислить $$e^{+n}$$ и сделать $$1/x$$. Считать сумму знакопеременного ряда -- ужасный метод, он запросто может дать полную ерунду. Ряд Лейбница суммировать можно, но надо проверять, что это именно ряд Лейбница, a не просто знакопеременный.
Последний раз редактировалось da67 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Алгоритмизация и решение системы линейных уравнений на ЭВМ

Сообщение qwertylol » 14 июн 2008, 09:52

Часто делают, как там написано, но это опасно, можно нарваться

Одно из заданий на контрольной: "Подсчитать синус 18-ти градусов c точностью до 10-6"
Насчёт того, что можно не дожить.. Считать ведь можно и так- $$\sin(x)\approx\sin(x1), x1=x-2\pi\cdot Trunc(\frac x{2\pi},1)$$. Правда c точностью конечно проблемы жуткие- точность равна разрядности c которой считаем минус старший разряд+1 числа, синус которого мы считаем(экспериментально ). T.e. если считаем до 17 знаков после запятой, a число, синус которого нужен имеет 12 разрядов$$\le 0$$, то последний точный знак после запятой 17-(12+1)=4.
И про вашу систему. Если ограничить точность шестью(и даже 10-тью) разрядами, то методы Якоби и Зейделя вообще не справляются . Итерации уходят в бесконечный цикл между $$10^{-5}$$ и нулём.
Последний раз редактировалось qwertylol 30 ноя 2019, 10:42, всего редактировалось 1 раз.
Причина: test


Вернуться в «Физика»

Кто сейчас на форуме

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