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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2016, 22:32   #1
crolikoff
Пользователь
 
Регистрация: 23.01.2016
Сообщений: 11
По умолчанию чем объясняется погрешность при сложение вещественных чисел и какими способами можно устранить эту погрешность в Pascal

Здравствуйте, подскажите пожалуйста, чем объясняется погрешность при сложение вещественных чисел и какими способами можно устранить эту погрешность в Pascal.
crolikoff вне форума Ответить с цитированием
Старый 01.02.2016, 22:43   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Как устранить, я не знаю, наверное, никак.
А объясняется она тем, что все числа, в том числе и вещественные, в ПК представляются в двоичной системе счисления. Даже если мы имеем дробь с конечной десятичной частью (например, 0.25), то при переводе в двоичную СС дробная часть может оказаться бесконечной последовательностью нулей и единиц (например, 0.00100111011001... - не факт, что это 0.25, просто от балды взял, такое число). Поскольку мы не можем хранить бесконечно много информации, эти числа приходится усекать, оставляя лишь некоторое количество знаков после запятой, поэтому на самом деле мы не получим 0.25, а получим вместо этого, например, 0.244444444444491. Отсюда погрешность.
Вадим Мошев вне форума Ответить с цитированием
Старый 01.02.2016, 22:46   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

0.25 как раз нормально, это степень двойки. А так да, просто пример не удачный.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.02.2016, 22:49   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну почему никак есть длинная арифметика. Берете где-нибудь или пишите сами такую программу, которая будет считать с такой погрешностью, которая будет незначительная для Вашей задачи. А так если в теории, то дело не только в машинном хранении, а вообще в математике. Ну вот 10/3 и все, абзац. Любой тип данных в виде конкретного значения числа всегда будет давать погрешность для данной операции.
А устранение погрешности решается точкой зрения на задачу. Погрешность есть всегда, при любых расчетах (практических расчетах разумеется). Но есть погрешность фатальная, та которая приводит к таким искажениям результата и промежуточных данных (особенно когда копится в циклах), что не дает объективного решения задачи. А есть погрешность незначительная, та которая не мешает видеть конечный результат. Ну вот например для здания не критично, если оно будет отличаться от проекта на одну миллиардную микрона по своей высоте. А если Вы создаете интегральную схему, то ошибка в миллиметр будет Вам стоить очень дорого.
Ну вот допустим взять астрономические расчеты - пока долететь до ближайшей звезды проблемно, поэтому расчеты расстояний ведутся с астрономическими погрешностями - десятые и сотые световых лет. Представляете если отправить космический корабль, который "промахнется" на такое расстояние? Есть например исторические погрешности, которые невозможно устранить из-за противоречий в первоисточниках, недостаточном количестве данных и т.д. Поэтому в истории есть такое понятие как нарратив - последовательность событий. То есть для истории важно не когда именно произошло событие с точностью до дня или там секунды, а какое событие следовало до или следует после данного. И чем старше вопрос, тем актуальней нарратив. Например, не важно когда цивилизация начала обрабатывать железо. Важно, что ни одна цивилизация не может начать обрабатывать железо не освоив технологию обработки меди. Это фактически доказанная аксиома. Вот такое вот решение проблемы погрешности.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 01.02.2016 в 23:01.
Utkin вне форума Ответить с цитированием
Старый 01.02.2016, 22:56   #5
crolikoff
Пользователь
 
Регистрация: 23.01.2016
Сообщений: 11
По умолчанию

Должен же быть способ контролировать (и возможно исправлять) эту погрешность, иначе это может привести к неправильной работе написанной программы в Pascal.
crolikoff вне форума Ответить с цитированием
Старый 01.02.2016, 23:07   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Вообще, есть математические способы избавления (вроде) от погрешностей (или что-то в этом роде).

Другие же способы направлены на минимизация погрешности. Например, решение дифференциального уравнения на отрезке [a; b]. При шаге n погрешность будет накапливаться быстрее, чем при шаге n/1000. То есть, надо просто уменьшить шаг сетки интегрирования.

Кроме того, есть математические методы, направленные на уточнение корней (речь уже об обычных, числовых уравнениях).

Цитата:
Сообщение от Utkin Посмотреть сообщение
Это фактически доказанная аксиома.
Аксиома - это утверждение, не требующее доказательств. Немного криво у тебя получилось.
Вадим Мошев вне форума Ответить с цитированием
Старый 01.02.2016, 23:08   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Должен же быть способ контролировать (и возможно исправлять) эту погрешность, иначе это может привести к неправильной работе написанной программы в Pascal.
Я же Вам уже написал - все расчеты практического характера ведутся некорректно, так как наши средства измерений не совершенно. Весы имеют погрешность, линейка имеет погрешность, спидометр в машине имеет погрешность. То есть Вы изначально работаете с неточными величинами допуская неточные операции (деление в частности). Смиритесь с этой мыслью. Чистые расчеты только в теории.
Матан здесь: https://ru.wikipedia.org/wiki/Погрешность_измерения
Поэтому контролировать погрешность в плане управления ею невозможно. Но можно определять в некоторых случаях уровень погрешности.
Цитата:
Аксиома - это утверждение, не требующее доказательств. Немного криво у тебя получилось.
Ну главное передал смысл
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 01.02.2016 в 23:10.
Utkin вне форума Ответить с цитированием
Старый 01.02.2016, 23:11   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Я уверен, что любая физическая величина для любого предмета выражается иррациональным числом.
Вадим Мошев вне форума Ответить с цитированием
Старый 01.02.2016, 23:14   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Я уверен, что любая физическая величина для любого предмета выражается иррациональным числом.
Это сложный философский вопрос. Системный анализ косвенно указывает на детерминированность мира. А физика чтобы перешагнуть через квантовость ввела понятие виртуальной частицы. Прямых доказательств разумеется ни у кого нет.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.02.2016, 23:20   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Хотя стоп.
Дополню свои слова. Строго говоря, эти величины - не константы. Например, линейные размеры - колеблются, а масса - постоянно уменьшается.
Это моё мнение, а что касается массы - наш преподаватель физики говорил об этом.

Цитата:
Системный анализ косвенно указывает на детерминированность мира. А физика чтобы перешагнуть через квантовость ввела понятие виртуальной частицы.
Можно чуточку понятнее?
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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