Pentium FDIV BUG

IL BUG

Il Pentium FDIV BUG è un errore di calcolo che i primi Pentium presentavano durante le operazioni in virgola mobile. Fu scoperto nel Giugno 1994 dal professor Thomas Nicely del Lynchburg College che, nell’Ottobre dello stesso anno, dopo aver verificato l’eliminazione di altri fattori quali errori di programmazione o di chipset delle motherborad utilizzate, contattò direttamente il produttore Intel, descrivendo l’errore e le modalità  per replicarlo.

In sostanza il professore, che stava lavorando con il suo staff nel calcolo di una particolare costante (la costante di Brun per la convergenza della serie somma dei reciproci dei numeri primi gemelli) si accorse che i PC utilizzati per il calcolo davano risultati errati in operazioni semplici come x(1/x) ovvero che l’identità x=x(1/x) aveva un resto nel calcolo in virgola mobile. Ripetendo il calcolo con PC con processori serie 80486 il risultato era corretto.

Il produttore Intel

Contattato il produttore Intel, la risposta fu che si era già  a conoscenza del bug (in particolare in una tabella di istruzione dell’assembly implementata nella FPU) e che si stava lavorando per eliminarlo.

In una fase iniziale però cercò di minimizzare il problema, ma alla fine la pressione dell’opinione pubblica, la presenza di articoli su riviste autorevoli e servizi televisivi della CNN, costrinsero Intel quasi un anno dopo la scoperta a definire un piano di sostituzione dei Pentium difettosi (“flawed”), con una previsione di costo pari a circa 475 milioni di dollari.

Riproduzione del BUG

Il professor Nicely si accorse che il calcolo di particolari quozienti produceva risultati non accurati, più precisamente il quoziente:

4195835.0/3145727.0 = 1.333 820 449 136 241 002 5 (Correct value)
4195835.0/3145727.0 = 1.333 739 068 902 037 589 4 (Flawed Pentium)

presentava un resto non nullo a partire dalla 4a cifra dopo la virgola, ovvero l’identità x=x*(1/x) non era verificata:

4195835.0 – 3145727.0*(4195835.0/3145727.0) = 0 (Correct value)
4195835.0 – 3145727.0*(4195835.0/3145727.0) = 256 (Flawed Pentium)

La verifica poteva essere fatta con codice Basic, Pascal, C (utilizzando solo la FPU per il calcolo), ma anche più semplicemente con la calcolatrice di Windows 95/98 o con un foglio di calcolo tipo Excel o Works (come verificato dalla comunità degli utenti su Internet).

Per il test il professor Nicely ha rilasciato il software libero pentbug scritto in C++ che verifica se è presente un resto nella divisione sopra. La stessa Intel ha rilasciato l’utility a riga di comando pentnt inclusa di default nelle distribuzioni di Windows NT 3.51, Windows NT 4.0, Windows 2000 e Windows XP.

Modelli con FDIV BUG

Pentium 60MHz
Intel S-Spec Q0352, Q0412, SX753, Q0466, SX835, SZ949

Pentium 66MHz
Intel S-Spec Q0353, Q0413, SX754, Q0467, SX837, SZ950

Pentium 75MHz
Intel S-Spec Q0601, Q0606, SX951

Pentium 90MHz
Intel S-Spec Q0542, Q0613, Q0543, SX879, SX885, SX909, SX874, Q0628, Q0611, Q0612, SX923, SX922, SX921, SX942, SX943, SX944, SZ951

Pentium 100MHz
Intel S-Spec Q0563, Q0587, Q0614, SX886, SX910, Q0677, SX960

Intel Pentium P5 60MHz SX835 Goldcap Processor Marking FDIV BUG
Intel Pentium P5 60MHz SX835 Goldcap Processor Marking FDIV BUG