Nel linguaggio di programmazione QBasic eseguo PRINT 0.04-(2000.07-2000.03). Ottengo la visualizzazione di
Consideriamo un foglio di calcolo elettronico così impostato:
A | B | |
1 | =2000.07-2000.03 | =(A1-0.04)*10^50 |
2 | =2000.07-2000.03 | =IF(A1=0.04;1;0) |
["=IF(test;P;Q)" si comporta come "IF test THEN PRINT P ELSE PRINT Q"; in alcuni fogli di calcolo, a seconda delle opzioni scelte, viene usato "SE" al posto di "IF"]
Se visualizziamo i valori, dando alla cella A2 l'opzione di rappresentare i numeri con 20 cifre, otteniamo:
A | B | |
1 | 0.04 | -3.64E36 |
2 | 0.03999999999996360000 | 0 |
In altre situazioni può anche capitare di credere che il valore di una cella sia 0, come appare sul visore, mentre 0 non è, e questo può dar luogo a successive elaborazioni molto "sbagliate".
È opportuno (per tutti i cittadini) essere consapevoli dell'esistenza di fenomeni di questo genere.
Spiegazione: l'essere un numero finito, ossia con periodo "0", dipende dalla base:
2000.07 → 11111010000.000100011110101110000101000111101
→ 11111010000.0001000111101
2000.03 → 11111010000.000001111010111000010100011110101
→ 11111010000.0000011110110
Non sono numeri binari finiti che vengono registrati arrotondati, nel caso del QBasic, a 24 cifre binarie; la sottrazione tra questi due numeri ha come risultato il numero binario 0.0000101000111 (che in base dieci diventerebbe 0.0399169921875, ovvero 3.991699E-02, non 0.04). Poi da:
0.04 → 0.00001010001111010111000010100011110101110000
→ 0.0000101000111101011100001010
viene sottratto 0.0000101000111000000000000000
dando luogo a 0.0000000000000101011100001010 che in base dieci diventa lo 0.000083 formito dal programma.