Страница Дмитрия Косовца

Меню

Приветствую на своей странице, гость! Меня зовут Дмитрий Косовец, я программист и тестировщик ПО, получил диплом ВМК МГУ, работал в разных местах, как с Web-технологиями, так и со standalone приложениями, как с backend, так и с frontend, мне нравятся Delphi и Perl, хотя имел дело и с другими языками. Также нравится TeX, в котором в студенческие годы небольшими коллективами были подготовлены материалы по лекциям. Мне нравятся виниловые пластинки, кактусы на подоконнике, грейпфруты и не только.

Материалы

Материалы по учебе на ВМК МГУ есть на ресурсах:

  • esyr.org (ориентировано на 3 поток после распределения)
  • tka4.org/study (ориентировано на 1 поток после распределения)

Материалы, подготовленные с моим участием или лично мной:

Перемена мест слагаемых

Запомнилась мысль, актуальная для программистов «От перемены мест слагаемых сумма меняется!»

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

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

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

Известен гармонический ряд, сумма дробей с единицей в числителе и последовательными натуральными числами в знаменателе, то есть единица, одна вторая, одна треть и т.д. Ряд бесконечен, но можно вычислить сумму его первых членов. Была написана тестовая программа на PHP с использованием обычных вещественных чисел, встроенных в сам язык. Программа рассчитывала двумя способами сумму первых 10 000 000 000 членов гармонического ряда, от больших к меньшим и от меньших к большим. Для контроля была использована система Wolfram Alpha, которая рассчитала сумму 23,603066594891989700785593303592...

При расчете от меньшего к большему программа выдала результат 23,603066594888 (10 корректных цифр после запятой), но при «наивном» расчете от большего к меньшему программа выдала результат 23,603066594998 (9 корректных цифр после запятой). Интересно, что при работе с вещественными числами по умолчанию идет представление с плавающей запятой. В таком представлении в десятичной системе счисления есть мантисса — число, представляющее собой дробь от 1,0 до 9,999..., и экспонента — показатель степени числа 10, на которую умножается мантисса. Например: 3,5 микрограмма есть 3,5 умноженное на 10 в степени −9 килограмм. 5,1 тонны есть 5,1 умноженное на 10 в степени 3 килограмм. В компьютере же используется двоичная система и мантисса есть двоичная дробь, которая умножается на 2 в степени экспоненты. При попытке суммировать два числа с существенно отличающимися экспонентами сумма может быть равна числу с большей экспонентой. Нетрудно догадаться, что в таком случае возможны совсем неверные расчеты, если большое количество чисел с небольшой экспонентой должны образовать значительную сумму.

Также была написана программа на PHP, использующая стандартную библиотеку BCMath, отдельный модуль PHP. В ней число представляется строкой. Была использована точность 25 знаков после запятой, что дало результат одинаковый и при расчете от меньшего к большему, и «наивным» способом от большего к меньшему 23.6030665948919892007955680 (15 корректных цифр после запятой, 10 дальнейших цифр ошибочны). Это лучше, чем при использовании средств языка по умолчанию, но пользоваться даже таким методом для точных расчетов нельзя.

  • HarmonicSumTest.php программа сумматора гармонического ряда на PHP, использующая средства языка по умолчанию
  • HarmonicSumBcMathTest.php программа сумматора гармонического ряда на PHP, использующая библиотеку BCMath

Деление на ноль

Как известно из начальной школы, на ноль делить нельзя. Есть хитрые надстройки, позволяющие что-то выдумать, но обычные вещественные числа на ноль не делятся. Если даже придумать некоторый воображаемый результат деления на ноль, встанет вопрос о взаимодействии уже этого результата с обычными числами, и возникнет сложность. В компьютере же что-то должно получиться, если производится деление на ноль. Это необходимо предусмотреть ввиду возможности по ходу выполнения алгоритма деления на ноль.

Простой пример: вы стоите в поле, в точке А. За километр от вас точка Б. Вы стоите на месте, то есть ваша скорость ноль километров в час. Очевидно, что не имеет смысла вопрос, когда вы попадете в точку Б, так как вы в нее не попадете таким образом. Аналогично не имеет смысла вопрос, когда вы попадете в точку А, так как вы в ней находитесь все время.

Когда производится деление положительного вещественного числа на ноль, условно компьютер предполагает, что результат стремится к плюс бесконечности. Аналогично при делении отрицательного числа на ноль результат предположительно стремится к минус бесконечности. При делении же нуля на ноль результат неопределен. Соответственно, есть три варианта результата деления на ноль в компьютере: +INFINITY, -INFINITY, Not A Number. В программах необходимо обрабатывать особым образом такие результаты и не производить с ними дальнейших действий, потому что это бессмысленно.

  • NumbersTest.php программа на PHP, показывающая работу механизма деления вещественных чисел на отличное от нуля число и на ноль с различными результатами

Интересно, что в классическом математическом анализе не вводится результатов, подобных вышеупомянутым +INF, -INF, NaN. Но это сделано в системе Wolfram Alpha, которая весьма продвинута. Действительно, нетрудно убедиться, что есть разница между отсутствием производной в точке области определения потому, что график функции «переламывается» и касательной нет в данной точке, потому, что производная стремится к плюс бесконечности слева и справа от данной точки, потому, что производной вообще нет ни в данной точке, ни в ее небольшой окрестности. Возможны и другие варианты.

Шут на будильнике

Существуют, помимо обычных игральных, карты Таро, их 78 арканов в колоде. На них чаще гадают и медитируют. В колоде 22 Старших аркана и по 14 Младших арканов четырех мастей. Арканы описывают глобально мироздание, огромными пластами архетипов. Изображают эти арканы по-разному в разных колодах, популярная светлая колода называется Райдера-Уэйта. Артур Эдвард Уэйт ее создал, Уильям Райдер ее первый издатель, а художник — Памела Колеман Смит. Мне нравится открывающий колоду Старший аркан Таро Шут, изобразил его в своей интерпретации на бумаге, картинка открывается в большем размере. Таро еще называют Приключения Шута, и именно этот молодой человек беспечен с узелком на пути к обрыву, а собака его останавливает, хватая за ногу. Солнце светит на эту картину сверху. У меня сцена изображена на будильнике, стрелки которого направлены вверх.

Следующий Старший аркан — Маг. У меня он тоже немного изменен по сравнению с колодой Райдера-Уэйта, к четырем символам стихий добавлен символ квинтэссенции — крылатое яйцо. Картинка также открывается в большем размере. Молодой человек призывает дух свыше в своем жесте, перед ним на столе лежат жезл, чаша, меч и пентакль, символы стихий Огня, Воды, Воздуха и Земли. Над ними парит крылатое яйцо, символ квинтэссенции или эфира. Вокруг зелень обвивает картинку. По Таро Райдера-Уэйта могу порекомендовать книгу Андрея Костенко Таро Уэйта как система: теория и практика.

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




© 2020-2024 Дмитрий Косовец,
e-mail: vedimak@justemail.net