Pull to refresh
6
0
Send message

Можно ли сложить N чисел типа double наиболее точно?

Reading time13 min
Views28K

В предыдущих сериях…


Прошлая статья рассказала о двух способах сложения двух двоичных чисел с плавающей запятой без потери точности. Чтобы добиться этого, мы представили сумму c=a+b в виде двух чисел (s,t)=a+b, причём таких, что s — наиболее близкое к a+b точно-представимое число, а t=(a+b)-s — это отсекаемая в результате округления часть, составляющая точную погрешность. У читателей был вопрос: а можно ли достаточно точно сложить массив чисел типа double? Оказывается, можно! Но только, вероятно, не всегда и не абсолютно… и не алгоритмом Кэхэна, который тогда вспоминали в комментариях. За подробностями прошу под кат, где мы и найдём приложение тому, о чём я рассказал в прошлый раз.


Total votes 76: ↑76 and ↓0+76
Comments45

Сложение двух чисел с плавающей запятой без потери точности

Reading time9 min
Views80K
Здравствуйте, друзья, как вы думаете, если мы напишем такой код:

s = a+b;
z = s-a;
t = b-z;

то не кажется ли вам, что в результате его выполнения получится, что t=0? С точки зрения привычной математики действительных чисел это и правда так, а вот с точки зрения двоичной арифметики с плавающей запятой в переменной t будет кое-что другое. Там будет то, что спасает нас от потери точности при сложении чисел $a$ и $b$. Кого интересует данная тема, прошу под кат.

Total votes 99: ↑97 and ↓2+135
Comments172

Аппаратный взлом жёсткого диска

Reading time14 min
Views127K

Жёсткие диски: если вы читаете эту статью, то с большой вероятностью у вас есть одно или несколько таких устройств. Они довольно просты и, по сути, представляют собой набор 512-байтных секторов, пронумерованных возрастающими адресами, также называемыми LBA (Logical Block Address). Компьютер, к которому подключен жёсткий диск (hard drive, HD), может считывать и записывать данные в эти сектора. Обычно используется файловая система, абстрагирующая все эти сектора до файлов и папок.

Неспециалисту может показаться, что оборудование HD должно быть довольно простым: достаточно всего лишь устройства, подключаемого к порту SATA, которое может позиционировать свои головки чтения/записи и считывать или записывать данные на пластины. Однако их работа намного сложнее: разве жёсткие диски не занимаются обработкой сбойных блоки и атрибутов SMART, и не имеют кэша, с которым тоже каким-то образом нужно работать?

Всё это подразумевает, что в жёстком диске есть что-то умное, а умность устройства подразумевает возможность его взлома. Меня всегда интересовали возможности взлома, поэтому я решил узнать, как жёсткие диски работают на немеханическом уровне. Подобные исследования уже проводились с разными видами оборудования, от PCI-карт расширения и встроенных контроллеров до ноутбуков и даже клавиатур Apple. Обычно исследования проводились для того, чтобы доказать, что возможность взлома этих устройств может привести к компрометации ПО, поэтому я захотел воспользоваться тем же подходом: создавая этот хак, я стремился создать жёсткий диск, способный обходить программную защиту.
Total votes 93: ↑92 and ↓1+127
Comments41

Запах сыра: ароматическое взаимодействие бактерий и грибков

Reading time12 min
Views9.2K


Многие из нас любят сыры, коих существует множество видов. Некоторые из них достаточно нежные на вкус и практически не пахнут, другие же способны заполнить своим ароматом все помещение. Какой бы ни был сыр, он имеет свойство портиться, как и любой другой продукт питания. Во время этого на его поверхности активно размножаются бактерии и грибковые образования. Первым признаком того, что такой сыр лучше не есть, является странный запах. Ученые из университета Тафтса (Медфорд, США) выяснили, что этот запах служит своеобразным методом коммуникации между бактериями и грибками. Как именно происходит ароматическая болтовня микроорганизмов в сыре, как это влияет на созревание сыра, и как данное исследование может помочь пищевой промышленности и не только? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.
Total votes 30: ↑30 and ↓0+30
Comments7

OpenPGP переписывают на Rust: проект Sequoia

Reading time8 min
Views7.8K

Секвойя Стагг в роще Олдер-Крик, Калифорния

В 2018 году три бывших разработчика GnuPG начали работу над проектом Sequoia — реализацией OpenPGP на Rust. Как известно, OpenPGP — это открытый стандарт шифрования данных, часто используемый для защищённой электронной почты; а GnuPG — эталонная реализация этого стандарта.

Сами разработчики так изложили мотивацию за создание новой библиотеки OpenPGP:

  • GnuPG трудно модифицировать. Код и API накапливались в течение 21 года. Модульные тесты отсутствуют. Компоненты тесно связаны друг с другом. Архитектура оставляет желать лучшего, и простой рефакторинг уже не поможет.
  • Многие разработчики недовольны программными интерфейсами GnuPG. У инструмента командной строки GnuPG и соответствующих программных библиотек разная функциональность: некоторые команды доступны только из командной строки.
  • Rust — безопасный для памяти язык, что автоматически исключает целый класс багов.
  • GnuPG невозможно использовать под iOS из-за ограничений GPL.
Читать дальше →
Total votes 33: ↑32 and ↓1+45
Comments16

std::atomic. Модель памяти C++ в примерах

Reading time11 min
Views119K

Для написания эффективных и корректных многопоточных приложений очень важно знать какие существуют механизмы синхронизации памяти между потоками исполнения, какие гарантии предоставляют элементы многопоточного программирования, такие как мьютекс, join потока и другие. Особенно это касается модели памяти C++, которая была создана сложной таковой, чтобы обеспечивать оптимальный многопоточный код под множество архитектур процессоров. Кстати, язык программирования Rust, будучи построенным на LLVM, использует модель памяти такую же, как в C++. Поэтому материал в этой статье будет полезен программистам на обоих языках. Но все примеры будут на языке C++. Я буду рассказывать про std::atomic, std::memory_order и на каких трех слонах стоят атомики.

Читать далее
Total votes 52: ↑52 and ↓0+52
Comments39

Основы компьютерной геометрии. Написание простого 3D-рендера

Reading time30 min
Views54K
Привет меня зовут Давид, а вот я собственной персоной отрендеренный своим самописным рендером:

image

К сожалению я не смог найти более качественную бесплатную модель, но все равно выражаю благодарность заморскому скульптору запечатлевшему меня в цифре! И как вы уже догадались, речь пойдет о написании CPU — рендера.
Читать дальше →
Total votes 34: ↑33 and ↓1+43
Comments21

Уязвимости в коде. Как отличить опасную брешь от незначительной ошибки?

Reading time18 min
Views15K
Как обычно выглядит проверка кода приложений на уязвимости? Специалист по безопасности инициирует процедуру, код сканируется, в приложении обнаруживаются тысячи уязвимостей. Все — и безопасник, и разработчики — в шоке. Естественная реакция разработчика: «Да наверняка половина — это ложные срабатывания, а другая — некритичные уязвимости!»

Что касается ложных срабатываний, здесь все просто: можно взять и посмотреть непосредственно те места кода, где обнаружены уязвимости с подозрением на false positive. Действительно, какая-то их часть может оказаться ложными срабатываниями, (хотя явно не половина от общего числа).

А вот о том, что критично, а что нет, хотелось бы поговорить более предметно. Если вы понимаете, почему сейчас уже нельзя использовать SHA-1 и зачем экранировать «;», возможно, эта статья не откроет вам чего-то нового. Но если по итогам сканирования от найденных уязвимостей рябит в глазах, добро пожаловать под кат – расскажем, какие «дыры» чаще всего встречаются в мобильных и веб-приложениях, как они работают, как их исправить, а главное — как понять, что перед вами — опасная брешь или незначительная ошибка в коде.


Читать дальше →
Total votes 25: ↑25 and ↓0+25
Comments1

Как переписать код на Rust

Reading time39 min
Views9K
В предыдущей статье мы говорили о том, как избежать переписывания библиотеки на Rust, когда вам это не нужно. Но как насчёт тех случаев, когда это действительно необходимо?

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

Однако у Rust есть убийственная особенность, когда речь заходит о таких вещах. Он может вызывать код на языке С без накладных расходов (т. е. среда P/Invoke в C#), и он выставляет функции, которые можно использовать в C так же, как и любые другие функции на языке С. Это открывает дверь для альтернативного подхода:

Портировать библиотеки на Rust по одной функции.
Читать дальше →
Total votes 16: ↑15 and ↓1+21
Comments16

“Чистый код”: пять ключевых моментов из обязательной к прочтению книги для программистов

Reading time5 min
Views62K

Недавно я написал о «Пять книг, которые изменили мой стиль программирования». В комментариях несколько читателей рекомендовали «Чистый код» Роберта С. Мартина. В результате я прочитал книгу и нашел ее достойной углубленного обзора.


Читать дальше →
Total votes 59: ↑57 and ↓2+66
Comments69

Совершенный цикл for

Reading time6 min
Views54K

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


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


for (int i=0; i<size; i++) {
    [...]
}

Хотя почему не могу, очень даже могу:


find . \( -name \*.h -o -name \*.cpp \) -exec grep -H "for (" {} \; | wc -l
43641

Наш текущий проект содержит 43 тысячи циклов. Проект пилю не я один, но команда маленькая и проект у меня не первый (и, надеюсь, не последний), так что в качестве грубой оценки пойдёт. А насколько такая запись цикла for хороша? Ведь на самом деле, важно даже не то количество раз, когда я цикл написал, а то количество раз, когда я цикл прочитал (см. отладка и code review). А тут речь очевидно идёт уже о миллионах.


На КПДВ узел под названием «совершенная петля» (perfection loop).


image


Так каков он, совершенный цикл?

Читать дальше →
Total votes 67: ↑65 and ↓2+88
Comments173

История IT. ООП

Reading time22 min
Views13K

Мою предыдущую статью «История IT. Когда компьютеры были большими…» мы завершили концом 80-х, когда произошло два знаменательных события. Во-первых, появился ООП и объектный язык C++. А во-вторых, появились персоналки, и это принципиально изменило задачи, стоящие перед IT-разработкой.


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


Главное изменение в том, что персоналки сделали компьютеры доступными небольшим компаниям. Потребовались системы автоматизации бизнес-процессов, которые сильно отличаются в разных компаниях. Типовую систему сделать сложно: сейчас такие системы уже есть, например, 1C, а в то время их не существовало. Как раз эту задачу помог решить ООП. Эту часть истории развития IT и концепций, которые тогда появились и до сих пор используются, я расскажу в этой статье.

Читать дальше →
Total votes 13: ↑12 and ↓1+17
Comments7

Движение это жизнь: кинематика сперматозоидов

Reading time13 min
Views17K


Человеческий организм можно без преувеличения причислить к ряду самых сложных биологических систем на планете. Наше тело состоит из миллиардов клеток, множества органов и систем. Но все это великолепие и разнообразие возникли благодаря слиянию лишь двух клеток — сперматозоида и яйцеклетки. Думаю, в пояснении, как происходит оплодотворение и что для этого требуется, нет необходимости (подсказка — аисты и капуста тут ни при чем). Но вот некоторые аспекты из жизни сперматозоидов долгие годы оставались неясными. Ученые из Бристольского университета, используя современные методики трехмерной микроскопии, смогли рассмотреть движения сперматозоида так, как это не удавалось ранее. Как и за счет чего движется сперматозоид мы узнаем из доклада ученых. Поехали.
Total votes 32: ↑30 and ↓2+40
Comments15

«Остановите Total Commander!» или главная проблема свободного ПО

Reading time10 min
Views156K

Сегодня мы попробуем разобраться, почему Open Source приложениями никто не хочет пользоваться. Статья получилась довольно длинной, но не пугайтесь, будет интересно.


Поехали!

Читать дальше →
Total votes 148: ↑97 and ↓51+83
Comments719

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 3

Reading time25 min
Views16K

Продолжаем наше исследование, посвященное ситуации в США со стрельбой полицейских и уровнем преступности среди представителей белой и черной (афроамериканской) рас. Напомню, что в первой части я рассказал о предпосылках исследования, его целях и принятых оговорках / допущениях; а во второй части была демонстрация анализа взаимосвязи между расовой принадлежностью, преступностью и гибелью от рук служб правопорядка. В этот раз посмотрим на географическое распределение анализируемых данных по штатам США.

Читать далее
Total votes 42: ↑35 and ↓7+40
Comments208

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 2

Reading time15 min
Views32K

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

Поехали!
Total votes 82: ↑76 and ↓6+96
Comments386

Black [O]lives Matter: раса, криминал и огонь на поражение в США. Часть 1

Reading time9 min
Views16K

Действительно ли полицейские в США стреляют больше в чернокожих, чем в представителей других рас? Связано ли применение силы полицией с расой? Связана ли криминальность с расой? Какова вероятность быть застреленным полицейским в США, если ты белый и если ты чернокожий? Вооружимся открытыми данными, python, pandas и постараемся пролить чуть-чуть света, отставив в сторону пропаганду и политику.

Мне любопытно
Total votes 28: ↑17 and ↓11+9
Comments45

Портируем утилиту командной строки с Go/Rust на D

Reading time9 min
Views3.7K
Несколько дней назад, на реддите в «программировании», Paulo Henrique Cuchi поделился своим опытом разработки утилиты командной строки на Rust и на Go (перевод на Хабре). Утилита, о которой идет речь, — это клиент для его пет-проекта Hashtrack. Hashtrack предоставляет GraphQL API, с помощью которого клиенты могут отслеживать определенные хэштэги твиттера и получать список соответствующих твитов в реальном времени. Будучи спровоцированным комментарием, я решил написать порт на D, чтобы продемонстрировать, как D может быть использован для подобных целей. Я постараюсь сохранить ту же структуру, которую он использовал в своем блогпосте.

Исходники на Гитхабе

Видео по клику
Читать дальше →
Total votes 11: ↑10 and ↓1+11
Comments4

Россия — месторождение слонов

Reading time10 min
Views32K
Давайте поговорим об Иваныче. Так зовут мамонта из музея в Тюмени. Иваныч был мужчиной в самом расцвете сил и умудрился то ли очень внезапно залезть в болото, то ли провалиться в какую-то воронку, но, в общем, стал героем задолго до тотального вымирания мамонтов. Что позволило учёным познакомиться с ним лично в более-менее целом виде, а в 49-м году признать самым большим и целостным из найденных мамонтов.

Естественно, комплект поставки Иваныча был как в Икее, только без половины деталей и инструкции. Это важно, потому что собирать доисторических животных можно по-разному. И получаться (иногда) будут разные виды. В общем, первая версия Иваныча была ростом 2,79 метра. Но за годы скелет подрос, и сейчас он уже 3,41 метра. При царе зверь ходил лицом в пол и зубами к земле, а в СССР уже считали, что он гордо поднимает свою морду и бдительно осматривает горизонт. Это сильно меняло сборку отделов позвоночника. Сейчас Иваныч стоит с высоко поднятым черепом.


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

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

Зачем ему столько шерсти? Ооо, это потому что рядом был ледник. Не зря же появились морозоустойчивые слоны, правда?
Читать дальше →
Total votes 124: ↑116 and ↓8+151
Comments75

Topleaked для анализа утечек памяти

Reading time8 min
Views3K


Что делает большинство программистов, когда узнают, что в их программе течёт память? Ничего, пусть пользователь покупает больше оперативы. Посмею предположить, что берут надёжный проверенный временем инструмент, такой как valgrind или libasan, запускают и смотрят отчёт. Там обычно написано, что объекты созданные на такой-то строчке программы такого-то файла не были освобождены. А почему? Вот этого нигде не написано.


Данный пост посвящён инструменту поиска утечек topleaked, идее статистического анализа, лежащего в его основе, и методам применения этого анализа.

Читать дальше →
Total votes 8: ↑8 and ↓0+8
Comments0

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity