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

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

Слайди можна знайти на .

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

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

Зауважимо, змусити людину самого подумати про щось важливе, перш ніж розповідати йому, «як правильно» — у загальному випадку добре, він набагато краще запам'ятає результат. Але почати з суті, тобто вибрати знання, яке потрібно передати людям, і проілюструвати його парадоксальною завданням з простими умовами   важко. Для паззлеров часто простіше узяти ті речі, які пам'ятати не дуже критично, проте їх ніхто не знає, і зробити з них чисте розвага.

Загалом, уважний читач легко простежить у цій статті мою нелюбов до жанру.

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

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

А так у мене залишилося подив: що це взагалі було? Інтеграл ще…

Не тільки як, а й чому
Мені в деяких місцях не вистачило розуміння, що саме курили розробники специфікації. Навіщо ж вони зробили саме так? Це допомогло б не тільки краще запам'ятати, але і відокремити важливі завдання від випадкової нісенітниці. Подивимося, наприклад, на раніше згадане округлення (починається в 12:20):



Звідки взялося округлення до найближчого більшого парного? Чому воно включено за замовчуванням? Коли потрібний режим «геть від нуля»? Можливо, тільки я все пропустив, а нормальні люди давно знають, але я це питання вперше в житті осмислив при підготовці даного розбору. Виявляється, режим носить назву «банківська округлення» і придуманий в основному для випадків, коли потрібно складати гроші з центами/копійками в дробовій частині. Оскільки різних значень центів всього 100, хвіст рівно 50 центів буде зустрічатися у випадковому наборі грошових сум досить часто. Якщо їх округляти геть від нуля, ми назбираємо систематичну помилку, а якщо до найближчого парним, то помилки округлення усреднятся приблизно в нуль. При цьому кожне конкретне число округлюється детерміновано, а не випадкову сторону (а то є і такий підхід).

Оскільки рахувати гроші з допомогою float і double не варто з багатьох причин, налаштування за замовчуванням виглядають нелогічними. Але, принаймні, зрозуміло, що за ними стоїть. А якщо хто-то знає інший реалістичний сценарій використання банківського округлення, поділіться, будь ласка.

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

Ось хто зараз згадає таблицю істинності для операцій з вправи 8 (початок 17:23), хоча в презентації вона була?



Це взагалі важливо знати? Якщо б розуміти сценарії, які мали на увазі розробники, відновити її було б легше.

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



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

Як влаштований float
Звичайно, у Вузі у нас були фрагменти курсів, а то й цілі курси, присвячені поданням даних. І звичайно, про числа з плаваючою точкою нам там розповідали, але без практики багато чого забувається. У деяких завданнях Андрій зачіпає фундаментальні властивості типу float і double і випливають з них проблеми, але не цілком акцентує на цьому увагу глядачів. Найяскравіший приклад   задача про асоціативність (вправа 14, початок о 31:30):



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





З точки зору даного формату між ними нічого немає. При цьому в реальному світі на перше число дорівнює 1.7014122 * 1038, друге   1.701412 * 1038, і різниця між ними становить 0.0000002 * 1038. Це, скажімо акуратно, офигительно багато. Додати до числа максимального порядку одиницю, тисячу або навіть мільярд неможливо.

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

Висновки
В цілому кожен паззлер   захоплююча історія, яка дає доповідачу кредит уваги аудиторії, і цим кредитом можна користуватися, щоб хоча б частини загадок вивести якусь мораль (вона там насправді є!). Впевнений, що доповідь від цього виграв би.

Слайди
Слайди зроблені добре, тому не буду чіплятися до дрібниць, а зазначу рішення, гідні наслідування.

Послідовне поява елементів слайда
У доповіді багато слайдів з великою кількістю інформації. Відразу все на екрані розгледіти і зрозуміти важко, але в Андрія все елементи виникають по черзі. Таким чином, глядач ні в який момент не втрачає того місця, на яке потрібно дивитися і про який говорить доповідач. Це дуже полегшує сприйняття великих схем, шматків коду, списків. Робіть, як Андрій.

Однаковість
Нехай у презентації майже немає смішних картинок, якщо не вважати Гомера Сімпсона (якого, в принципі, можна було пошукати в дозволі краще) і інтеграла, вона від цього не стає менш веселою. Математика сама по собі — це весело.

При цьому кожна вправа оформлено однаково, рішення виділено однаково, пояснення позначено в заголовку слайда   глядач швидко звикає і ніщо не відволікає його від рішення головоломок. Якщо у вас презентації багато маленьких історій, має сенс дотримуватися подібного оформлення, як у даному випадку.

Регулярні розбори
Якщо ви хочете отримати зворотний зв'язок щодо свого виступу, то я з радістю вам її дарую.
Що для цього потрібно?
  • Посилання на відеозапис виступу.
  • Посилання на слайди.

  • Заявка від автора. Без згоди самого доповідача нічого розбирати не будемо.
Все це потрібно відправити хабраюзеру p0b0rchy, тобто мені. Обіцяю, що відгук буде конструктивним і ввічливим, а також висвітлить і позитивні моменти, а не тільки те, що треба покращувати.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.