Off-by-one error: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Botcrux (discussione | contributi)
m Bot: codifica, sostituzione o rimozione di caratteri unicode per spazi tipografici particolari
Riga 6:
Consideriamo un [[array]] di oggetti, dei quali processare quelli compresi da un certo valore ''m'' ad uno ''n'' (estremi inclusi). Quanti elementi si trovano in questo range? Una risposta intuitiva potrebbe essere ''n'' – ''m'', ma questo è proprio un errore di off-by-one, più precisamente del tipo '''fencepost'''; la risposta corretta è infatti (''n'' – ''m'') + 1.
 
Proprio per via di questa contro-intuitività, i range nell'informatica sono spesso rappresentati da [[Intervallo (matematica)|intervalli]] semi-aperti; il range da ''m'' ad ''n'' inclusivo infatti, è rappresentato dagli elementi che vanno da ''m'' (incluso) ad ''n'' + 1  (escluso), proprio per evitare errori di fancepost. Per esempio, un [[Iterazione|ciclo]] che itera cinque volte (da 0 a 4 incluso) può essere scritto come un intervallo semi-aperto da 0 a 5:<syntaxhighlight lang="c">
for (i = 0; i < 5; i++)
{
Riga 41:
In caso di utilizzo di numeri molto grandi, avere una ripetizione in più può non essere un problema così evidente. Avendo a che fare con numeri più piccoli invece, soprattutto in casi specifici nei quali la precisione è essenziale, commettere un errore off-by-one può essere disastroso. A volte l’errore potrà essere inoltre ripetuto e anche peggiorato, nel caso in cui un susseguirsi di persone utilizzino uno stesso calcolo errato portandoselo dietro di volta in volta (ovviamente l’errore potrebbe anche venire corretto).
 
Un esempio di quando un errore di questo tipo si può verificare coinvolge il linguaggio [[MATLAB]],  durante l’utilizzo della funzione <code>linspace()</code>. I parametri di questa funzione sono (limite inferiore, limite superiore, numero di valori) e non (limite inferiore, limite superiore, numero di incrementi). Un programmatore che fraintende il terzo parametro, intendendolo come “numero di incrementi”, potrebbe pensare che <code>linspace(0,10,5)</code> genererebbe la sequenza <code>[0, 2, 4, 6, 8, 10]</code>, mentre in realtà l’output sarebbe <code>[0, 2.5, 5, 7.5, 10]</code>.
 
== Implementazioni di sicurezza ==
Riga 69:
<references />
* Una versione precedente di questo articolo è disponibile alla voce [[foldoc:fencepost error|fencepost error]] su [[foldoc:|FOLDOC]], utilizzato con i relativi [[:en:Wikipedia:Foldoc_license|permessi]]
* Edsger Wybe Dijkstra (2 Maggio 2008).  [http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html "Why numbering should start at zero (EWD 831)"]. Archivi ''E. W. Dijkstra''. [[Università del Texas a Austin|Università di Austin in Texas]]. Informazioni recuperate il 3 Marzo 2011.