Приветствую всех!
Знаю: тема багов, которые изменили мир, избита уже настолько, что на ней не осталось живого места. Но сейчас мы не будем просто говорить о самых выдающихся таких случаях. Сейчас мы затронем лишь один из них: ту самую ошибку в процессоре 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 была вынуждена сдаться, а все, кому была важна точность вычислений, получили возможность бесплатно заменить дефектные процессоры. Сейчас экземпляр с таким багом представляет неплохую коллекционную ценность.
Такие дела.

❯ Ссылки

  1. Computational Aspects of the Pentium Affair

  2. Intel Pentium FDIV bug reverse engineered

  3. Pentium FDIV bug

  4. How Intel makes sure the FDIV bug never happens again

  5. Intel's $475 million error: the silicon behind the Pentium division bug


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.

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


  1. mark_ablov
    12.12.2025 08:31

    У Кена не только серия твитов есть про этот баг, но и полноценная статья - https://www.righto.com/2024/12/this-die-photo-of-pentium-shows.html


    1. MaFrance351 Автор
      12.12.2025 08:31

      О. Сходу не нашёл её. Спасибо за ссылку.