Помилка Pentium FDIV

Помилка Pentium FDIV - це помилка в модулі операцій з плаваючою комою в оригінальних процесорах Pentium, що випускалися фірмою Intel в 1994. Помилка виражалася в тому, що при проведенні ділення над числами з плаваючою комою за допомогою команди процесора FDIV в деяких випадках результат міг бути некоректним.

Дана помилка була вперше виявлена ​​і опублікована професором Лінчбургского коледжу Томасом Найслі в жовтні 1994 року [1].

Згідно із заявою Intel причиною проблеми послужили неточності в таблиці пошуку, використовуваної при проведенні операції ділення [2].


Відтворення помилки

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

4195835.0/3145727.0 = 1.333 820 449 136 241 002 (Правильне значення)

4195835.0/3145727.0 = 1.333 739 068 902 037 589 (Помилкове значення, що повертається процесором, що містить дефект)

Більш наочний спосіб відтворення:

4195835 * 3145727/3145727 = 4195835 (При множенні і діленні на одне і те ж число отримуємо початкове число)

4195835 * 3145727/3145727 = 4195579 (Помилкове значення, що повертається процесором, що містить дефект)


Методи захисту

  • В компіляторі Delphi передбачена опція Pentium Safe FDIV, що змушує компілятор замість використання асемблерній команди FDIV в коді програми, застосовувати виклик спеціальної процедури, яка при першому виклику робить перевірку наявності помилки, і в залежності від результату при цьому і наступних викликах, або виконує простий FDIV, або проводить корекцію результату.
  • У компіляторі Visual Basic передбачена перевірка наявності даної помилки, яка включена за замовчуванням. Однак вона відключається спеціальною опцією компілятора - Remove Safe Pentium FDIV Checks. У разі її включення, компілятор не генерує додатковий код, і в деяких випадках швидкість обчислень зростає.