Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Офтопик > Мысли вслух
Перезагрузить страницу О точности компьютерных вычислений
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 02.04.2009, 15:46

Вот, есть такой текстик. Интересно ваше мнение.
Цитата:
Прогресс науки и техники приводит к лавинообразному возрастанию потребности общества в вычислениях. Эта потребность не может быть удовлетворена без привлечения компьютерной техники. При этом большинство вычислений выполняются при помощи специализированных компьютерных программ. Насколько можно доверять полученным таким путем результатам? Общеизвестно, что ни одна из программ не застрахована от наличия ошибок. Но особенностью компьютерного производства сложных расчетов является отсутствие практической возможности произвести их ручную проверку, Таким образом, нельзя обнаружить ошибку без нового привлечения компьютера, теперь уже в качестве эксперта. Следовательно, проблема надежной верификации компьютерных расчетов становится все более актуальной.

Верификация расчетных программ чаще всего сводится к последовательной верификации их отдельных блоков на основе систем контрольных тестов. Низкая надежность такого способа связана с ничтожным объемом реально выполняемых тестов по сравнению с многообразием реальной информации. Существующие методики оптимального подбора тестов ориентированы в основном на проверку логической структуры алгоритма, их задача – выявление ошибок при прохождении редко используемых ветвей программы. Между тем, вычислительные алгоритмы имеют свои особенности. Без всякого логического ветвления в процессе вычислений могут возникать неожиданные ошибки, проявляющиеся лишь при определенном подборе исходных данных.

Отметим особо один из возможных источников вычислительных ошибок. Он связан с диапазоном используемых данных. Особенность приближенных компьютерных приближений, в которых традиционно используются так называемые «числа с плавающей точкой», такова, что сложение чисел, значительно различающихся по порядку, может приводить к существенной потере точности. Такую ситуацию сложно спрогнозировать заранее, так как исходные данные для большинства блоков алгоритма сами являются результатом каскада предварительных вычислений.

Каковы же возможные пути верификации компьютерных расчетов? Самым очевидным представляется совместное использование нескольких независимых продуктов разных разработчиков и сравнение полученных результатов. Но может оказаться, что эти продукты используют одну и ту же библиотеку, в которой скрыта ошибка, или одну и ту же расчетную схему, приводящую к ошибке.

Представляется целесообразным ориентировать архитектуру программ на облегчение верификации вычислений. Предлагается модульная организация вычислительных программ, обеспечивающая строгий контроль допустимых значений на входе и выходе каждого модуля. По возможности следует выполнять математическую проверку результатов работы каждого модуля. К числу желательных возможностей следует отнести протоколирование значений на входе и выходе каждого модуля, а также динамическую замену модулей на аналогичные при обнаружении проблем в вычислительном процессе.
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 02.04.2009, 16:37

Баян-с. Точность вычислений не зависит ни от используемого ЯП, ни от модульности программ или математической проверки их результатов. А зависит - исключительно от качества прокладки между стулом и клавиатурой. Все.

Value: 10.00000000000000000000000000000000000000000000000 000000000000000000000000000000
00000000000000000000000
Sq. root: 3.162277660168379331998893544432718533719555139325 216826857504852792594438639238
2213442481083793002951
Squiare : 9.999999999999999999999999999999999999999999999999 999999999999999999999999999999
9999999999999999999994

Язык - C++. Класс "ну оооочень длинного числа" ваяется ручками за полдня. И?

Собственно, все известные проблемы, проистекающие из пресловутой "неточности" вычислений (начиная с истории с "Ариан-5", несть им числа.....) - это не следствие неверного кодирования, а следствие ошибок в анализе требований и формулировании спецификаций требований.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 02.04.2009, 17:41

Да вроде библиотек для arbitrary precision arithmetic уже создано более 9000...
Ответить с цитированием
  (#4 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 02.04.2009, 19:10

Проблема существует только одна. На точность вычислений просто махают рукой. Даже если вы, будучи заинтересованным в данной теме, в своей программе делали всё правильно, то нет никакой гарантии, что также сознательно себя вёл и создатель компилятора. К примеру я читал (хотя сведения уже устаревшие), что компилятор Borland С++ точнее в этом плане, чем Microsoft Visual C++, но кого это волнует?
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 02.04.2009, 19:22

Цитата:
не следствие неверного кодирования, а следствие ошибок в анализе требований и формулировании спецификаций требований.
Но ведь это как раз и составляет смысл проблемы. Программист добросовестно пишет то, что ему заказано, а вот практическая ценность полученных результатов оказывается сомнительной. И чем дальше - тем больше, к сожалению.

Цитата:
Проблема существует только одна. На точность вычислений просто махают рукой.
Собственно, текст об этом, разве нет?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
beroal beroal вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 13.12.2002
По умолчанию 02.04.2009, 21:06

Цитата:
По возможности следует выполнять математическую проверку результатов работы каждого модуля.
Это собственно и есть самое мощное решение. А именно, математическое доказательство, что программа удовлетворяет спецификации. Отлавливает в том числе и
Цитата:
неожиданные ошибки, проявляющиеся лишь при определенном подборе исходных данных
Только надо различать "надёжность" и "точность". Я думаю, надёжность -- отсутствие ошибок, точность -- контроль за погрешностью, отклонением реального числа (имеющего ограниченное количество разрядов) от "идеального" вещественного числа.

Цитата:
Особенность приближенных компьютерных приближений, в которых традиционно используются так называемые «числа с плавающей точкой», такова, что сложение чисел, значительно различающихся по порядку, может приводить к существенной потере точности.
Наверное, автор хотел сказать, что при вычитании относительная погрешность может быть намного больше, чем относительная погрешность аргументов, если относительная разница аргументов мала.
Ответить с цитированием
  (#7 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 02.04.2009, 23:14

Цитата:
Проблема существует только одна. На точность вычислений просто махают рукой. Даже если вы, будучи заинтересованным в данной теме, в своей программе делали всё правильно, то нет никакой гарантии, что также сознательно себя вёл и создатель компилятора.
Совершенно верно. "Разруха не в клозетах, разруха в головах!"
Собственно, если при разработке программы требования к точности вычислений не документируются и не отслеживаются, а значит - и не проверяются, точность и получается "как получится". Но это как раз - не вина программистов. Это вина бизнес-аналитиков, маркетологов, постановщиков задач.... и т.д. подобной публики. Попросту говоря, незнание ими предметной области. Программисты же - что им заказали, то они и напишут...

Насчет создателей компиляторов. Не знаю, конечно, как там с Лиспом, Хаскелем и другими "более другими" языками, но с Си и С++ ситуация однозначная, - точность вычислений регламентируется Стандартом языка для каждого типа с плавающей точкой. Не соблюдать Стандарт разработчики компиляторов этих языков не могут, - конкуренция на этом рынке оооччень высока! "нестандартный" компилятор моментально быстро вылетит с рынка, и над ним и его разработчиками будут смеяться во всех профессиональных форумах и ньюсгруппах. Другое дело, что разработчики компилятора могут сделать точность вычислений и повыше, чем требует Стандарт (а могут - и не сделать); но вот хуже Стандарта они сделать не могут.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#8 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 02.04.2009, 23:55

Цитата:
Собственно, текст об этом, разве нет?
Не совсем. Как таковой проблемы с точностью нет. А то если следовать этой статье, то можно подумать, что вообще все расчёты неточны.

Цитата:
Насчет создателей компиляторов. Не знаю, конечно, как там с Лиспом, Хаскелем и другими "более другими" языками, но с Си и С++ ситуация однозначная, - точность вычислений регламентируется Стандартом языка для каждого типа с плавающей точкой. Не соблюдать Стандарт разработчики компиляторов этих языков не могут, - конкуренция на этом рынке оооччень высока! "нестандартный" компилятор моментально быстро вылетит с рынка, и над ним и его разработчиками будут смеяться во всех профессиональных форумах и ньюсгруппах. Другое дело, что разработчики компилятора могут сделать точность вычислений и повыше, чем требует Стандарт (а могут - и не сделать); но вот хуже Стандарта они сделать не могут.
Конкретно с MS Visual C++ была (а может есть ещё) проблема, что сгенерённый им код мог обнулять флажок переполнения после операции с плавающей точкой. Стандарт стандартом, но в компиляторе элементарно могут быть баги. А наличие этого бага, говорит о том, что в М$ точность вычислений не проверялась - видимо никто не требовал.
Ответить с цитированием
  (#9 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,270
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 03.04.2009, 02:03

Я понимаю данный текст примерно так: если мы пишем какую-нибудь житейскую программу, то ее ошибки обычно выплывают достаточно быстро. Но если мы пишем какую-то сложную расчетную программу, то нет средств оценить, верно она работает или нет. Конечно, если она выдаст неправдоподобный результат, то мы это заметим. А если результат будет правдоподобный, но неверный, то мы сглотнем это, не имея средств проверить.
Ответить с цитированием
  (#10 (permalink)) Старый
zevun zevun вне форума
Member
 
Сообщений: 551
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.08.2007
По умолчанию 03.04.2009, 03:35

Полагаю, что все ограничения и недостатки чисел с плавающей точкой давно известны. Программист должен быть в курсе о тех местах в программе, где возможна потеря точности. Нужно проверять данные на соответствие установленным условиям и, если это не так, применять другой алгоритм, либо возвращать ошибку. Вроде ничего страшного. Хотя как это делается на практике я не знаю, это просто мои соображения.
Ответить с цитированием
  (#11 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.04.2009, 03:54

Кстати, вот, например, протокол NTP(Network Time Protocol) имеет свой формат представления дробных чисел. Просто два 32битных счетчика для целой(секунды) и дробной части(доли секунды).
Ответить с цитированием
  (#12 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 03.04.2009, 06:49

Чем они меряют время с такой точностью, что им нужно 32-битное число для представления долей секунды?
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,958
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 03.04.2009, 10:15

Есть хорошее средство для обеспечения точности - вести все арифметические расчёты в СОКе (системе остаточных классов). Так работали наши старые ПВО-шные и ПРО-шные комплексы. Как в современных не знаю - давно уволился.
Ответить с цитированием
  (#14 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 03.04.2009, 11:55

Цитата:
Есть хорошее средство для обеспечения точности - вести все арифметические расчёты в СОКе (системе остаточных классов). Так работали наши старые ПВО-шные и ПРО-шные комплексы. Как в современных не знаю - давно уволился.
Ну, это еще в 70-е годы пробовали. Просто очень медленно.
Потому все последие лет 50 - 60 Вычислительная математика ищет алгоритмы, стабильные относительно накапливающих ошибок и ошибок округления.
Кстати, именно в этой области есть реальные достижения у советских математиков.
Когда в 1988 году Горбачев попрекал Рейгана, что США переманивает советских программистов, то именно этих спецов он и имел в виду.
Ответить с цитированием
  (#15 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 03.04.2009, 12:12

Цитата:
Чем они меряют время с такой точностью
На первом уровне(stratum 1) может быть, например, атомный эталон или GPS . Далее передается вниз по иерархии уровней, при этом идет процесс постоянной синхронизации и обменом информации. Трава та еще...
Хотя последняя реализация с ntp.org просто тупо конвертит этот формат в сишный double и работает уже с ним. Хотя в тех же сорцах есть всякие макросы для работы именно с форматом NTP.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отзывы о компьютерных корпусах grizzli Корпуса 162 02.02.2012 13:18
Задача для компьютерных Шерлоков Dolly Sheep's Clone Любые вопросы от новичков 3 03.11.2011 17:31
Автоматическое распараллеливание вычислений Сидорович Софт и программы 3 09.08.2010 13:37
Организация рекурсивных вычислений в Lisp dron4ikk Lisp 3 04.05.2010 18:04
Ошибка стека при использовании плавающей запятой двойной точности viruss C++ Builder 2 12.06.2007 11:31
Для тех, кто ждет окончания вычислений Fuud Зацените! 8 28.04.2007 15:39
ProgressBar - показывает процент вычислений toshkaexe C++ Builder 5 05.04.2007 18:12
C++ распределенная система вычислений -=Shade=- Вопросы начинающих программистов 0 12.04.2006 21:41
Арифметика произвольной точности Shaft С/С++ 2 29.04.2004 18:30
Округление float до заданной точности YricSoft Алгоритмы 4 27.04.2004 12:51
Переводчик компьютерных терминов. esergey Офтопик 1 02.04.2004 14:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов