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

Итак, сегодня мы разберёмся, что же это был за баг в данном теперь уже ретро-процессоре. Узнаем, как он проявлялся, как его воспроизвести и, конечно же, увидим вживую, как всё это работало.
❯ Суть такова
Думаю, все вы не раз (думаю, даже тут) читали посты про самые сокрушительные ошибки в истории ЭВМ. Одной из них неизменно значится предмет нашей сегодняшней статьи: Intel Pentium и его ошибка деления. Суть её была довольно проста: на некоторых комбинациях чисел с плавающей запятой сопроцессор «пенька» при делении выдавал неверное значение. Этих самых комбинаций было не так уж и много, поэтому обнаружили проблему не сразу, однако после выяснения обстоятельств стало ясно, что пренебрегать дефектом нельзя.

Концом истории случился массовый отзыв дефектных чипов и многомиллионные убытки на их бесплатную замену. Работники Intel в назидание получили вот такой сувенир, где под слоем эпоксидки покоился кристалл того самого процессора. Хотя этот просчёт сам по себе никого не убил и ничего не уничтожил, удар по репутации был сокрушительным (хотя, конечно, и не фатальным).
И вот, прочитав не так давно об этом в очередной раз, я захотел показать самое интересное: то, как данная проблема вообще проявлялась и насколько реально было простому пользователю с ней столкнуться. Тем более, что ещё никто на Хабре это не показывал, а всё необходимое для такого опыта железо уже много лет имелось у меня на руках.

По традиции вставлю неизменную для таких статей картинку с тем самым процессором.
Это Intel Pentium A80501-66, некоторые спецификации (S-spec) которого имели эту ошибку. Конкретно на фото представлен SX837, у которого данный нюанс присутствует.

Далеко не все «пеньки» имеют данный дефект. Более того, даже у вышеупомянутой модели у некоторых экземпляров (например, SX950) данный баг отсутствует.
❯ Чуть-чуть про деление в Pentium
Вообще, данная тема также хорошо описана, а описание того, как устроено и как работает деление в микропроцессорах, и вовсе потянет на ещё одну статью, с пеньками никак не связанную.
Но кое-что всё-таки ст��ит упомянуть. Причиной данного глюка являлся переход на более быстрый алгоритм деления (SRT, названный по именам создателей — Sweeney, Robertson, Tocher) вместо shift-substract, использовавшегося в более старых сопроцессорах. Алгоритм этот использует в своей работе таблицу поиска на основе делимого и делителя. В Pentium использовалась реализация SRT-4 (Radix 4), где ячейки таблицы могли принимать одно из пяти значений: -2, -1, 0, +1 и +2. Это должно было значительно упростить вычисления, так как такое решение позволяет выбирать частное, ориентируясь только на старшие биты делимого и делителя, а скорректировать результат уже потом. Также данный алгоритм позволял обрабатывать несколько бит за один такт, что также повышало скорость. Именно в этой таблице поиска и была проблема: некоторые её ячейки были пусты.

Сама таблица была реализована в виде программируемой логической матрицы.
Такое решение было сделано из-за куда большей простоты по сравнению с ПЗУ. Поэтому под пустыми ячейками тут понимаются не оставшиеся незаписанными участки памяти, а ошибочно не предусмотренные в нужных местах транзисторы. На самом деле число таких битых участков в таблице было вовсе не 5, как говорят в большинстве источников, а 16, однако 11 из них не вызывали неверный результат. Это и была та самая аппаратная ошибка, приводившая к сбоям. Была ли причиной опечатка в программе, генерировавшей данную таблицу, или математическая ошибка разработчиков Intel, теперь уже неведомо.

Как оказалось, существует очень крутая серия постов, описывающая то, как реализована данная матрица в Pentium и где именно в ней кроются дефекты. Поэтому не буду повторяться в описаниях, как вообще это устроено, лучше сразу ознакомиться с оригиналом по ссылке.
Ну а мы переходим к опытам.
❯ Обзор оборудования
Чтобы воспроизвести данный баг, необходим компьютер и два процессора Pentium — обычный и дефектный.

За основу для ПК возьмём материнку A-Trend ATC-1000 на чипсете i430FX «Triton», как раз одном из первых чипсетов для процессоров Pentium. Само собой, поддержка нужных нам процессоров здесь тоже в наличии. Ещё круче было бы взять плату с Socket 4 или 5, но у меня такой пока нет.

PCI видеокарта SiS 6202, первая из попавшихся под руку карт.

Самый важный элемент машины — пенёк.
Это Pentium A80502-100 на 100 МГц. Позолоченный, керамический, приятно тяжёлый. Круче него из x86-процессоров, наверное, только Pentium Pro. Достался мне этот камень ещё лет десять назад, будучи вытащенным из процессорной платы от некоего брендового сервера на платформе Intel Xpress Server LX, кажется, HP NetServer LM. Сама плата (а, может, и материнка) оказалась в нерабочем состоянии, оживить её я в своё время не смог и в итоге продал весь этот комплект какому-то другому любителю ретроПК.

Смотрим, что там по характеристикам. FDIV bug, как и положено, в наличии.

Второй процессор, на этот раз намного более поздний и данной ошибки в себе не содержащий.
На всякий случай напомню, что у Pentium разных поколений разное напряжение питания, поэтому, перетыкая процессоры без перестановки перемычек на материнской плате, вы рискуете поджарить свой камень.
Также, само собой, понадобится и другая периферия: клавиатура с мышью, жёсткий диск (на который я уже успел накатить Windows 98), две планки памяти по 16 МБ, AT блок питания.
❯ Запускаем
Ну что же, собираем тестовый стенд и включаем БП.

А вот и наша Windows 98.
Также видны наши характеристики — 32 мегабайта ОЗУ и тот самый процессор Pentium. В данный момент тут вставлен самый обычный пень, данного недостатка лишённый.
❯ Как же это работает?
Перейдём непосредственно к проверке.

Открываем стандартный калькулятор Windows. Да-да, даже в этом простом приложении можно без труда воспроизвести данный глюк.

Теперь переключаем его в инженерный режим и вводим туда следующее выражение:
(4195835 / 3145727) * 3145727 — 4195835
На нормальном процессоре результатом его выполнения должен быть ноль.

Его-то мы и наблюдаем.

Выключаем компьютер. Время устанавливать золотой пень.

Загружаемся и снова пробуем вычислить данное выражение.
На этот раз мы получаем неверный ответ -256. Это и есть влияние данного бага.

Чуть менее наглядно его можно воспроизвести, если просто поделить между собой эти два числа и получить неверный ответ.
❯ Что же в итоге?
На самом деле далеко не все числа делились неправильно. Здесь представлена только одна из довольно немногочисленных пар, которые при делении давали неверный результат. Поэтому во многих задачах вероятность встретить его была довольно невелика. Впрочем, в этом-то и заключалась подлость такой ошибки, поскольку обнаружить такой «плавающий» дефект может быть очень непросто.
Итоги мы все хорошо знаем — Intel была вынуждена сдаться, а все, кому была важна точность вычислений, получили возможность бесплатно заменить дефектные процессоры. Сейчас экземпляр с таким багом представляет неплохую коллекционную ценность.
Такие дела.
❯ Ссылки
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.
Комментарии (16)

OrtoXylene
12.12.2025 08:31супер, спасибо. тоже хотел год или два назад купить такой процессор, но цены на них на Авито ого-го, именно на те, что с багом.

MaFrance351 Автор
12.12.2025 08:31А у меня этот процессор уже почти десять лет, но руки продемонстрировать этот глюк не доходили.

Superzoos
12.12.2025 08:31Было бы очень интересно поискать примеры программ в которых этот баг виден визуально и влияет на функциональность вызывая аномалии, например в видеоиграх. Понимаю, что найти сложно , но наверняка такое существует

PerroSalchicha
12.12.2025 08:31Было бы очень интересно поискать примеры программ в которых этот баг виден визуально и влияет на функциональность вызывая аномалии, например в видеоиграх
А не найдёте. Шанс реально увидеть это появляется только в вычислениях - научных, инженерных, реже финансовых, например.

Superzoos
12.12.2025 08:31Ну вообще шанс есть. Та формула, которая позволяет увидеть ошибку не так уж сложна. Например если в игре есть алгоритм , который выпускает луч по направлению взгляда и ищет пересечения с обектами , то теоретически можно подобрать позицию и направление при котором игрок будет взаимодействовать с объектом, который находится мягко говоря не там , где должен был. Просто это чертовски сложно заметить. Надо специально внедрять в игру код, который будет проверять конкретные алгоритмы на корректность и будет логировать все ситуации в которых произошла ошибка, чтобы можно было воспроизвести ситуацию в которой эта ошибка проявляется. Если провести такой анализ для алгоритмов, работа которая видна визуально, то можно увидеть ошибку невооружённым глазом. Думаю, что самой простой игрой, где такой анализатор ошибок можно вкорячить это майнкрафт)) хотя можете предложить свой вариант.

PerroSalchicha
12.12.2025 08:31Ну вообще шанс есть. Та формула, которая позволяет увидеть ошибку не так уж сложна. Например если в игре есть алгоритм , который выпускает луч по направлению взгляда и ищет пересечения с обектами
Во-первых, количество игр с движками на вещественных числах, работающих на Pentium 100, стремится к нулю. Во-вторых, данный баг привносит погрешность этак в пятом знаке, и на дисплее с разрешением этак 800х600 в лучшем случае вы даже на пиксель не промахнётесь с такой низкой погрешностью.

strvv
12.12.2025 08:31В большинстве матпакетов осталась проверка на неправильные процессоры. и при инициализации библиотек на таких процессорах -вместо FDIV будет софтверная реализация.

strvv
12.12.2025 08:31Ну допустим в играх - вряд-ли - в то время в массе использовались целочисленная и фиксированной запятой и вместо деления производили умножение и сдвиг вправо, тогда этот эффект не применялся.
Деление очень ресурсоемкое. В играх точность ограничена, время как можно меньшее.
В научных нужна точность, время расчётов менее важно.
Поэтому этот баг не будет в играх заметен.
Более поздние, от 1995 и позднее матпакеты отдельно содержали проверку ядер, и в случае деления - пускали деление на функциональное.Почему в курсе - в это время был студентом и активно моделировали те же плоские фазированные решетки, другие модели, как на пентиуме 60, так и на 133 пентюхе, а по возможности математику гнали на микроВаксах-2, всего-лишь 16МГц, но производства 1988 года.

Kirill_Klad
12.12.2025 08:31спасибо большое за статью, а также за предоставленный тест, десять мысленных плюсов Вам за проделанную работу!

dom1n1k
12.12.2025 08:31Я помню в настройках C++ Builder галку "Pentium fdiv fix" - на всякий случай включал её, хотя это была перестраховка конечно.

cdriper
12.12.2025 08:31Абраш и Кармак нашли себе приключения, когда нарвались на этот баг во время разработки Quake. Были подозрения, что это какой-то глюк разрабатываемого движка и его очень долго и упорно дебажили.
mark_ablov
У Кена не только серия твитов есть про этот баг, но и полноценная статья - https://www.righto.com/2024/12/this-die-photo-of-pentium-shows.html
MaFrance351 Автор
О. Сходу не нашёл её. Спасибо за ссылку.
kaseiiro
Эх, сколько ж ресурсов PLA израсходовали на реализацию бага... и как изящно починили.