Разбор доклада Андрея Акиньшина про арифметику

Всем привет, готов ещё один разбор. Сегодня будем смотреть доклад не с JPoint, а с DotNext! Автор доклада — Андрей DreamWalker Акиньшин, и посвящено его выступление деталям реализации арифметики с плавающей точкой в .NET:

Слайды можно найти здесь.

Дисклеймер: про реализацию арифметики только сам разбираемый доклад, а не собственно статья.

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

Заметим, заставить человека самого подумать о чём-то важном, прежде чем рассказывать ему, «как правильно» — в общем случае хорошо, он гораздо лучше запомнит результат. Но начать с сути, то есть выбрать знание, которое нужно передать людям, и проиллюстрировать его парадоксальной задачей с простыми условиями — трудно. Для паззлеров часто проще взять те вещи, которые помнить не очень критично, зато их никто не знает, и сделать из них чистое развлечение.

В общем, внимательный читатель легко проследит в этой статье мою нелюбовь к жанру.

Сюжетные ходы и игра актёров


Нет ли тут противоречия: на сцену приходят помощники, чтобы создать иллюзию соревнования, но видно, что ответы и переходные реплики между задачами известны заранее. Например, на 12:00–12:20 Юля рассуждает о том, что приведение к целому — не та операция, и нужно использовать округление, и тут же появляется следующая задача, как раз на округление. Я бы в таких ситуациях менял порядок задач, чтобы тема, которая якобы «пришла в голову» ассистенту, возникала не сразу, а чуть позже. Для большего правдоподобия ассистенты могли бы иногда соглашаться друг с другом.

Также мне кажется неудачным камео Андрея Дмитриева (39:00). Понятно, зачем эта сценка нужна: прорекламировать следующий DotNext и следующий доклад. Но раз уж мы говорим, что кончилось время, хотя есть ещё задачки, то пусть всё выглядит, как будто это правда. Во-первых, выступать «под обрез» и не говорить, что у нас есть ещё несколько минут на вопросы. Во-вторых, засветить две-три дополнительных задачи с ответами и промотать слайды с ними в момент прерывания. Тогда народ, глядишь, заинтересуется, вдруг ещё эффект Зейгарник сработает, будут презентацию качать, всем хорошо.

А так у меня осталось недоумение: что это вообще было? Интеграл ещё…

Не только как, но и почему


Мне в некоторых местах не хватило понимания, что именно курили разработчики спецификации. Зачем-то же они сделали именно так? Это помогло бы не только лучше запомнить, но и отделить важные задачи от случайной ерунды. Посмотрим, например, на ранее упомянутое округление (начинается в 12:20):

b1d73d1a23854aefaa998915a33bacbd.png

Откуда взялось округление до ближайшего чётного? Почему оно включено по умолчанию? Когда нужен режим «прочь от нуля»? Возможно, только я всё пропустил, а нормальные люди давно знают, но я этот вопрос впервые в жизни осмыслил при подготовке данного разбора. Оказывается, режим носит название «банковское округление» и придуман в основном для случаев, когда нужно складывать деньги с центами/копейками в дробной части. Поскольку разных значений центов всего 100, хвост ровно в 50 центов будет встречаться в случайном наборе денежных сумм довольно часто. Если их все округлять прочь от нуля, мы накопим систематическую ошибку, а если к ближайшему чётному, то ошибки округления усреднятся примерно в ноль. При этом каждое конкретное число округляется детерминированно, а не в случайную сторону (а то есть и такой подход).

Поскольку считать деньги с помощью float и double не следует по многим причинам, настройки по умолчанию выглядят нелогичными. Но, по крайней мере, понятно, что за ними стоит. А если кто-то знает другой реалистичный сценарий использования банковского округления, поделитесь, пожалуйста.

Мне кажется, поднимать логику, стоящую за спецификацией, и рассказывать её зрителям — полезно и хорошо. Запоминать не только факты, но и их причины гораздо удобнее.

Вот кто сейчас вспомнит таблицу истинности для операций из упражнения 8 (начало 17:23), хотя в презентации она была?

bd7b9751b1e04e47b24020c42e9d2f6a.png

Это вообще важно знать? Если бы понимать сценарии использования, которые имели в виду разработчики, восстановить её было бы легче.

Актуальность упражнения 10, напротив, не поставить под сомнение (начало на 21:18):

6d7fa58f977f46ceb01968ec3796dc40.png

Андрей рассказывает, в каких ситуациях можно наступить на проблему с OverflowException и заканчивает рассказ оптимистичным пожеланием быть аккуратнее. А все ли сразу поняли, как именно нужно быть аккуратнее? Тут бы не помешали подробности.

Как устроен float


Конечно, в ВУЗе у нас были фрагменты курсов, а то и целые курсы, посвящённые представлению данных. И конечно, про числа с плавающей точкой нам там рассказывали, но без практики многое забывается. В некоторых задачах Андрей затрагивает фундаментальные свойства типа float и double и вытекающие из них проблемы, но не вполне акцентирует на этом внимание зрителей. Самый яркий пример — задача про ассоциативность (упражнение 14, начало в 31:30):

36c8ff0819094c3d93aa57c7be75aba6.png

Учитывая, что не все в зале ответили правильно, материал первого-второго курса стоит освежить. В данном случае важно, что числа распределены неравномерно: чем дальше от нуля, тем больше между ними промежутки. Давайте рассмотрим два соседних float’а максимального порядка (double по смыслу такие же, только рисовать больше):

30e45abc33f44266931857cb5b5e1401.png

c99051d307f6452caa6493aeca4e423c.png

С точки зрения рассматриваемого формата между ними ничего нет. При этом в реальном мире первое число равняется 1.7014122×1038, второе — 1.701412×1038, и разность между ними составляет 0.0000002×1038. Это, скажем аккуратно, офигительно много. Прибавить к числу максимального порядка единицу, тысячу или даже миллиард невозможно.

Зная эту механику, легко понять, как ещё нарушается правило ассоциативности: сумма нескольких маленьких чисел может оказаться больше, чем расстояние между двумя соседними большими, тогда как каждое маленькое число в отдельности будет просто уничтожено, если начинать сложение с большого числа.

Выводы


В целом каждый паззлер — увлекательная история, которая даёт докладчику кредит внимания аудитории, и этим кредитом можно пользоваться, чтобы хотя бы из части загадок вывести какую-нибудь мораль (она там на самом деле есть!). Уверен, что доклад от этого выиграл бы.Слайды
Слайды сделаны хорошо, поэтому не стану придираться к мелочам, а отмечу решения, достойные подражания.

Последовательное появление элементов слайда


В докладе много слайдов с большим количеством информации. Сразу всё на экране разглядеть и понять трудно, но у Андрея все элементы возникают по очереди. Таким образом, зритель ни в какой момент не теряет того места, на которое нужно смотреть и о котором говорит докладчик. Это очень облегчает восприятие больших схем, кусков кода, списков. Делайте, как Андрей.

Единообразие


Пусть в презентации почти нет смешных картинок, если не считать Гомера Симпсона (которого, в принципе, можно было поискать в разрешении получше) и интеграла, она от этого не становится менее весёлой. Математика сама по себе — это весело.

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

Регулярные разборы
Если вы хотите получить обратную связь по своему выступлению, то я с радостью вам её предоставлю.
Что для этого нужно?
  • Ссылка на видеозапись выступления.
  • Ссылка на слайды.
  • Заявка от автора. Без согласия самого докладчика ничего разбирать не будем.

Всё это нужно отправить хабраюзеру p0b0rchy, то есть мне. Обещаю, что отзыв будет конструктивным и вежливым, а также осветит и положительные моменты, а не только то, что надо улучшать.

Комментарии (0)

© Habrahabr.ru