Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2016, 23:45   #11
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Системный анализ утверждает что все вокруг нас это системы состоящие из объектов. Объекты это самостоятельные элементы. При этом согласно утверждениям системного анализа сами объекты также являются системами, состоящими из объектов. Либо объектов овердофига либо они когда-нибудь кончатся. В любом случае можно взять очень мелкий объект и в нем измерить большую систему.
Ну например - Звезда состоит из ядра и короны. Ядро состоит из атомов, атом состоит из нейтронов, протонов, электронов и т.д. Электрон состоит из кварков. Кварк состоит из преонов (гипотетически, не доказано практикой). Преоны либо конечные элементы (что вряд ли) либо еще из чего-то состоят. Пока части системы отличаются друг от друга их можно самих раскладывать на части. Это абсолютно за счет операции сравнения. Ну вот любую звезду можно измерить например в кварках . Расстояние - сколько кварков поместиться от сих до сих (кварк не может быть в кварке, так как они взаимодействуют). Вес - сколько кварков образуют такую массу (точнее могут образовывать). Объем - сколько кварков можно запихнуть в бутылку и т.д. Кварками нельзя померять преоны (так как они меньшие части), но с другой стороны преона еще не поймали. Как только поймают преона - все материальное можно измерять в преонах и это будет целое число в том числе и пространство тоже.
А в физике с этим проблемы. Это из разряда кота который не жив и не мертв. Ряд уравнений и сам системный анализ строго настрого запрещают неопределенность как физическое явление. Не знание информации об объекте не делает его состояние неопреденным для самого объекта. Иными словами то что Вы не знаете сдох Ваш кот или нет, не означает что кот "завис", он реально или сдох или сдохнет когда-нибудь. Нельзя посмотреть в одну щелку и увидеть живого кота и посмотреть в другу щелку и увидеть дохлого того же самого кота. А волна и прочие плюшки требуют кота Шредингера. Чтобы выйти из противоречия и придумали виртуальные частицы. Они как бы объясняют все происходящее случайностью, но при этом сами они строго детерминированы. Это элементы которые убирают фатализм (конечность и дискретность элементов теоретически позволяют предсказать любое из возможных состояний системы, типа как цыганка - все знаю, что было, что будет) из вселенной, предположительно без внешнего в нее вмешательства. Сумбурно, но как-то так.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 01.02.2016 в 23:57.
Utkin вне форума Ответить с цитированием
Старый 01.02.2016, 23:53   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Ошибка при сложении.
1) Есть ошибки связанные с переводом из одной системы счисления в другую.
Такой перевод происходит при компиляции программы. Поэтому стоит понимать что вы не путаете с ними.
2) Собственно сами ошибки вычисления.
Память в компьютере конечная, а числа в математики бесконечные.
Это принципиальное ограничение. И вы не как его не устраните.
Если к примеру мы складываем два десятичных числа
Код:
1.00001+1.00005E-5
То прежде чем выполнить сложение компьютер приведет их к одной степени и отброситлишнее.
Код:
1.00001+0.0000100005
1.00001+0.00001
1.00002
Итого хвост потеряли.
Это погрешность инструментальная. Её можно контролировать к примеру выбрав больше разрядов для числа. Использовать тип Extended. Или длинную арифметику.

3) Есть ошибка методическая. Или лучше сказать алгоритмическая.
Где-то был хороший пример, всё никак не найду.
Просуммируем числа. Тут Delphi.
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
    i,n : Integer;
    t, add, summa1, summa2: Real;
begin
    Write('n = ');
    ReadLn(n);
    summa1 := 0;
    for i := 1 to n do
    begin
        t := 1.0/i;
        add := Sqr(t);
        summa1 := summa1 + add;
    end;
    WriteLn('Summ l/i^2 to i = 1 do ', n);
    WriteLn('S1 = ', summa1);
    Summa2:=0;
    for i := n downto 1 do
    begin
        t := 1.0/i;
        add := Sqr(t);
        summa2 := summa2 + add;
    end;
    WriteLn('Summ l/i^2 to i = n downto ', 1);
    WriteLn('S2 = ', summa2);
    WriteLn('dS = Summ2-Sum1');
    WriteLn('dS = ', summa2-Summa1);
    Write('<Enter>');
    ReadLn;
end.
Код:
n = 10000000
Summ l/i^2 to i = 1 do 10000000
S1 =  1.64493396684732E+0000
Summ l/i^2 to i = n downto 1
S2 =  1.64493396684823E+0000
dS = Summ2-Sum1
dS =  9.13713549266504E-0013
<Enter>
Ошибка в 3-х знаках в конце. Это связано с тем что стандарт IEEE 754 на числа с плавающий точкой гарантирует минимальную ошибку.

Если изучить алгоритм. То очевидно что ошибка будет когда мы будем складывать от меньших к большим числам. Поэтому тут правильно использовать downto.

Для разных задач поиск алгоритма устойчивого к ошибкам индивидуален.

В школе нас учили вначале произвести вычисления в виде символов. И только в конце делать подстановку.

В методе Гаусса при обращении матриц использовать выбор ведущего элемента.

Про матрицы. Есть такая вещь как число обусловленности. Это число которое говорит какая будет конечная ошибка. Так вот формула расчёта такого числа зависит от алгоритма!
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.02.2016, 00:05   #13
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от crolikoff Посмотреть сообщение
Должен же быть способ контролировать (и возможно исправлять) эту погрешность, иначе это может привести к неправильной работе написанной программы в Pascal.
Это возлагается на самого кодописца.
И это не только в Pascal, но и в Си и прочих. И в Excel если сложите 1 и 1e20, а потом вычесть 1e20, то будет 0, а не 1.

Если у вас
Код:
var a,b:Double;  // или Real, или Extended;
то нельзя проверять на равенство
Код:
if a=b ...
надо на >= или <=

Ну и погрешность учитывать, например у Double - примерно 15 значащих цифр.
Не складывать несоизмеримых значений:
Код:
var a,b,c:Double;
begin
 a:=1;
 b:=1e20;     // до 10^16 будет нормально
 c:=(a+b)-b;
 WriteLn(c);  // 	будет 0, а не 1
 ReadLn;	
END.
А так, чисто практически 15..16 значащих цифр вполне хватает. Зачем вам например расстояние до Плутона с точностью менее 0,5 сантиметра ?

Правда иногда раздражает, когда вместо явного 0 вылазит типа 5.567e-16
type_Oleg вне форума Ответить с цитированием
Старый 02.02.2016, 08:37   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

на всякий случай, всем курить это.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 02.02.2016, 09:13   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,759
По умолчанию

Цитата:
То прежде чем выполнить сложение компьютер приведет их к одной степени и отброситлишнее.
Неа. Сначала числа расширяются, а уже потом, если надо, результат сужается. Т.е. получится 1.0000200005. Если вы потом положите ее в переменную меньшей точность или сделаете приведение типов...
p51x вне форума Ответить с цитированием
Старый 02.02.2016, 13:48   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
на всякий случай, всем курить это.
Мы это уже курили
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.02.2016, 13:58   #17
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Мы это уже курили
Судя по факту существования данной темы - аффтор не курит.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что не правильно? Программа на C++ находит минимум правильно, а максимум нет. В чем погрешность? rafael999 Помощь студентам 3 26.10.2013 11:21
Погрешность в интегрировании Luzifer Общие вопросы C/C++ 0 30.05.2012 20:25
Относительная погрешность A.M.G_Dig Помощь студентам 4 20.11.2010 22:57
Какими способами в String можно узнать является ли первый символ пробелом? Des Помощь студентам 10 07.11.2010 11:19
Какими способами можно реализовать кэширование для прокси - сервера? Slavka8800 Работа с сетью в Delphi 0 02.06.2009 22:08