Zum Inhalt springen

Zaunpfahlfehler

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 20. Juni 2017 um 11:32 Uhr durch Neitram (Diskussion | Beiträge) (Distanz vs. Anzahl: Diese Relationen gelten, egal ob die Objekte mit 0, mit 1 oder einer beliebigen anderen Zahl beginnend nummeriert werden.). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Ein Zaunpfahlfehler (englisch fencepost error) ist ein Fehler, der aus einer Verwechslung der Anzahl Objekte in einer Reihe und der Distanz zwischen diesen Objekten entsteht. Probleme aus diesem Themenfeld werden auch Zaunpfahlprobleme genannt. Der Begriff wird vor allem in der Informatik verwendet.[1][2][3] Probleme und Fehler dieser Art gibt es aber in allen Lebensbereichen.

Der Begriff stammt aus der Analogie zu einem Zaun, der aus Pfählen und Zwischenfeldern in einer geraden Reihe besteht (nicht ringförmig geschlossen). Bei diesem ist die Zahl der Zwischenfelder stets um 1 kleiner als die Zahl der Pfähle. Die Länge des Zauns ergibt sich aus der Länge der Zwischenfelder mal ihrer Anzahl, und nicht aus dem Pfahlabstand mal der Anzahl Pfähle. Es müssen zum Beispiel 11 Pfähle gesetzt werden, die je 3 Meter auseinander stehen, um einen 30 Meter langen Zaun zu errichten.

Illustration des Zaunpfahlproblems: Für 10 Zaunsegmente werden 11 Pfähle benötigt.

Distanz vs. Anzahl

Diese Fläche hat 5 Streifen. Streifen Nummer 1, 3 und 5 sind schwarz, Streifen 2 und 4 sind gelb. Streifen 1 und 5 haben einen Abstand (Distanz) von 5 − 1 = 4 Streifenbreiten. Einschließlich Anfangs- und Endstreifen sind es 5 − 1 + 1 = 5 Streifen. Zwischen ihnen liegen 5 − 1 − 1 = 3 Streifen.
Bei einem Maßband entspricht die Vorderkante dem Wert 0, um damit korrekt Distanzen zwischen zwei Punkten zu messen.

Der Kern des Zaunpfahlproblems liegt im Unterschied zwischen Distanzen und Anzahlen. Hat man eine Folge von durchnummerierten Objekten, so beschreibt die Differenz der Nummern zweier Objekte deren zahlenmässigen Abstand, identisch mit der Anzahl der Objektabstände. Will man hingegen die Anzahl Objekte einschließlich beider Endpunkte wissen, so muss man zur Differenz 1 addieren. Will man die Anzahl dazwischenliegender Objekte ohne die beiden Endpunkte wissen, so muss man von der Differenz 1 subtrahieren.

Betrachtet man zum Beispiel den Bereich, der durch die Objekte Nummer 20 bis 30 in einer aufsteigenden Folge definiert ist, so gilt:

  • Die Differenz 30 − 20 = 10   ist die Anzahl der Objekte einschließlich Nummer 20, aber ohne Nummer 30, oder die Anzahl der Objekte einschließlich Nummer 30, aber ohne Nummer 20.
  • Die Rechnung 30 − 20 + 1 = 11   ist Anzahl der betrachteten Objekte einschließlich Start- und End-Objekt („Inklusivzählung“).
  • Die Rechnung 30 − 20 − 1 = 9   ist Anzahl der dazwischenliegenden Objekte ohne Start-Objekt und ohne End-Objekt.

Diese Relationen gelten, egal ob die Objekte mit 0, mit 1 oder einer beliebigen anderen Zahl beginnend nummeriert werden. Jedoch bietet es sich beim Bestimmen von Distanzen an, mit dem Start-Objekt als 0 zu zählen zu beginnen, weil dadurch die Nummer des End-Objekts der Distanz zum Nullpunkt entspricht. Um dagegen Objekte selbst zu zählen, bietet es sich an, mit dem Start-Objekt als 1 zu zählen zu beginnen, weil dadurch die Nummer des End-Objekts der Anzahl der gezählten Objekte entspricht. Werden die Zählweisen verwechselt, so liegt ein Zaunpfahlfehler vor.

Informatik

Zaunpfahlfehler zeigen sich typischerweise in einem Zahlenwert, der um 1 zu groß oder zu klein ist. Als Programmierfehler in der Informatik nennt man solche Fehler auch Off-by-one-Errors. Sie gehören zwei Hauptgruppen an:

  1. Verwechslung von Distanzen und Anzahlen. Wenn es um den Abstand von Elementen in einer Liste geht, muss sich der Softwareentwickler im Klaren darüber sein, ob eines oder beide Grenzelemente mitgezählt werden oder nicht.
  2. Zählung ab 0 oder ab 1: Im Alltag beginnen Menschen Aufzählungen meist bei 1, in vielen Programmiersprachen wie C oder Java beginnen Aufzählungen hingegen standardmäßig bei 0. Das liegt daran, dass in diesen Programmiersprachen der Index in einem Feld (Array) eine Distanz (einen Offset) zur Startadresse des Feldes angibt. Das erste Element beginnt unmittelbar an der Startadresse, hat also den Offset 0. Die Elemente eines Feldes der Länge 5 haben die Indizes 0, 1, 2, 3 und 4. Ein typischer Anfängerfehler ist es, in Schleifen den Index bis zur Länge des Feldes (5) laufen zu lassen – was einen Adressierungsfehler erzeugt – anstatt bis zur Länge des Feldes minus 1.

Verwandte Probleme

Die historische Inklusivzählung

Distanzen und Zeit­räume wurden von der Antike bis in nachmittelalterliche Zeit hinein nach der „Inklusivzählung“ angegeben. Bei dieser Zählweise wird sowohl das Anfangs- als auch das Endelement einer Folge mitgezählt. Der Startpunkt wird als „1“ definiert und von dort weitergezählt. Der Distanz 0 wird somit der Zahlenwert „1“ zugewiesen, der Distanz 1 der Zahlenwert „2“, usw. Die Werte für Distanzen, Zeiträume usw. sind also bei der Inklusivzählung immer um 1 größer als nach heutiger mathematischer Konvention. Historisch hat die Inklusivzählung ihre Ursache in dem Umstand, dass das Konzept der Zahl Null erst mit der Einführung der arabisch-indischen Zahlen ab dem 13. Jahrhundert in Europa bekannt wurde.

Eines der frühesten Beispiele für einen Zaunpfahlfehler geschah bei der Kalenderreform des Gaius Iulius Caesar. Caesar hatte ein Schaltjahr in jedem vierten Jahr angeordnet. Die Priester verstanden dies jedoch nach der Inklusivzählung als ein Schaltjahr alle drei Jahre.

Von der Inklusivzählung rührt zum Beispiel der Brauch her, zu „in einer Woche“ neben „in sieben Tagen“ auch „in acht Tagen“ zu sagen, obwohl jeder weiß, dass eine Woche sieben Tage hat. Der aktuelle Wochentag wird bei der Inklusivzählung mitgezählt:

Wochentag: Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag Montag
„Nummer“ des Tages: 1 2 3 4 5 6 7 8

Im Französischen wird nach gleichem Schema für „in zwei Wochen“ oft „en quinze jours“ (in 15 Tagen) gesagt.

Ein anderes Beispiel für die Inklusivzählung sind die Namen der musikalischen Intervalle:

Distanz zweier Töne: 0 1 2 3 4 5 6 7
Name des Intervalls: Prime Sekunde Terz Quarte Quinte Sexte Septime Oktave
Kommt von lat. Zahl: 1 2 3 4 5 6 7 8

Dass der in der Musik übliche Name jedes Intervalls um 1 zu groß ist, sieht man unter anderem bei der Addition von Intervallen. Eine Quarte und eine Quinte ergeben zusammen eine Oktave. Aber 4 + 5 ist nicht 8 – vielmehr ist 3 + 4 = 7.

Zeitrechnung

Jahr null

Die christliche Zeitrechnung kennt kein Jahr null, sondern geht vom Jahr 1 v. Chr. direkt ins Jahr 1 n. Chr. über. In der astronomischen Zeitrechnung wird dagegen das Jahr 1 v. Chr. als Jahr null gerechnet.

Christliches Jahr: 2 v. Chr. 1 v. Chr. 1 n. Chr. 2 n. Chr.
Astronomisches Jahr: −1 0 1 2

Jahrhunderte

Das bekannte Logo des Filmstudios 20th Century Fox. Auch im Englischen bezeichnet 20th century das Jahrhundert von 1901 bis 2000.

Es gab kein „nulltes Jahrhundert“. Das 1. Jahrhundert dauerte vom 1. Januar 1 n. Chr. bis zum 31. Dezember 100 n. Chr. Ein Jahrhundert umfasst immer die hundert Jahre, die mit dem entsprechenden vollen Jahr enden. Entsprechend wird der Zeitraum vom 1. Januar 1901 bis zum 31. Dezember 2000 als das 20. Jahrhundert bezeichnet, und das 21. Jahrhundert begann am 1. Januar 2001.

Im Italienischen werden neben der normalen Bezeichnung der Jahrhunderte („XX secolo“) auch umgangssprachlich die Jahrhunderte so benannt, dass „Novecento“ (wörtlich: neunhundert) den Zeitraum von 1900 bis 1999 bezeichnet. Dies ist jedoch nur für Jahrhunderte ab dem Jahr 1100 möglich. Im Englischen gibt es in ähnlicher Weise die Möglichkeit, mit „1900s“ (gesprochen nineteen-hundreds) den Zeitraum 1900–1999 zu bezeichnen. Bei der letzten Jahrtausendwende feierten auch viele im deutschsprachigen Raum den Jahrtausendwechsel bereits 1999/2000 anstatt 2000/2001.

Jahrestage

Jahrestage (zum Beispiel Geburtstage) feiern die Vollendung und nicht den Beginn der angegebenen Jahre. Ein Mensch, der seinen 18. Geburtstag feiert, beginnt deshalb nicht an diesem Tag sein 18. Lebensjahr – vielmehr hat er schon volle 18 Jahre gelebt und beginnt sein 19. Lebensjahr.

Der Tag der Geburt eines Menschen ist also sozusagen sein „0. Geburtstag“, ähnlich wie die Markierung 0 auf einem Zentimetermaß.

Geburtstag:  Geburt   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
                   \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ /
Lebensjahr:         1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18

In einigen Kulturkreisen (z. B. China) ist das hingegen anders: der Tag der Geburt ist der „1. Geburtstag“.

Bei Ereignissen, die regelmäßig einmal jährlich stattfinden, sind eine runde Jubiläumsausgabe und das entsprechend alte Jubiläum des Beginns der Veranstaltungs- oder Ausgabeserie (der ersten Ausgabe) um ein Jahr voneinander entfernt, was oft zu Unklarheiten führt. So wurde 1955 das erste Guinness-Buch der Rekorde ausgegeben, 1956 der erste Eurovision Song Contest abgehalten. Zum 60. Eurovision Song Contest im Jahr 2015 wurde berichtet, das Guinness-Buch der Rekorde feiere ebenfalls seinen 60. Geburtstag, die beiden seien also genau gleich alt.[4]

Finden der Mitte

Wird beim Zählen mit 1 begonnen, dann entspricht die Mitte nicht der Hälfte der Anzahl der Elemente. Zum Beispiel sei eine Skala von 1 bis 10 gegeben. Die 5 liegt hierbei nicht in der Mitte der Skala, sondern darunter. Die tatsächliche Mitte liegt bei 5,5:

1 2 3 4 5 6 7 8 9 10
         ^Mitte

Auch Folgendes mag zunächst unintuitiv erscheinen oder „überraschen“: Von fünf Elementen, nummeriert 1 2 3 4 5, ist das mittlere Element das mit der Nummer 3 – obwohl die Hälfte von 5 bekanntlich 2½ ist.

Bei einer Skala von 0 bis 10 hingegen hat man 11 Indizes und die Mitte liegt bei 5:

0 1 2 3 4 5 6 7 8 9 10
          ^Mitte

Der Grund hierfür ist der gleiche wie beim oben beschriebenen Zaunpfahlproblem. Die obere Skala hat die Indizes 1 bis 10. Diese werden als Punkte betrachtet. Damit beschreibt die Skala jedoch nur eine Länge (Strecke, Distanz zwischen Anfang und Ende) von 9, denn 10 − 1 = 9. Ihre Mitte liegt daher bei der Hälfte von 9, gerechnet ab dem Index 1: 1 + (9 / 2) = 5,5.

Die untere Skala mit den Indizes 0 bis 10 hingegen beschreibt eine Länge von 10 und ihre Mitte liegt bei 0 + (10 / 2) = 5.

Stockwerke

Im deutschen Sprachraum ist der 1. Stock das erste aufgestockte, also erste Obergeschoss, im Unterschied zum darunterliegenden Erdgeschoss oder Parterre. Gleiches gilt für die aus dem Französischen entlehnte 1. Etage: Auch diese meint damit das erste Obergeschoss. In vielen Kulturen dagegen, z.B. den USA, Kanada oder der ehem. Sowjetunion, beginnt die Zählung bereits mit dem Erdgeschoss als der Nummer 1, und auch wenn in Deutschland statt Stockwerken Ebenen durchnummeriert werden, wird dabei oft schon im Erdgeschoss mit dem Zählen bei 1 angefangen, was jedes Mal wieder auf ein Zaunpfahlproblem hinausläuft: „3. Stock oder 3. Geschoss, Ebene 3 oder drei Treppen hoch?“ Siehe auch Zählung der Obergeschosse.

Bei drei oder auf drei und dann?

„Bei drei oder auf drei und dann?“ ist ein berühmtes Zitat aus der Actionfilm-Reihe Lethal Weapon. Hier ist das Problem, ob man die gemeinsam geplante, überraschende Aktion beginnen soll, nachdem man bis drei gezählt hat oder genau dann, wenn man drei sagt.

Anmerkungen und Einzelnachweise

  1. Jesse Liberty, David Horvath: Jetzt lerne ich C+: das komplette Starterkit für den einfachen Einstieg in die Programmierung ; [Start ohne Vorwissen]. Pearson Deutschland, 2004, ISBN 978-3-8272-6830-3, S. 290 (books.google.com). [1]
  2. Andrew Koenig: C Traps and Pitfalls. Pearson Education, 1988, ISBN 978-81-7758-139-3, S. Section 3.6 (books.google.com).
  3. Steve Heller: C++: a Dialogue: Programming with the C++ Standard Library. Prentice Hall Professional, 2003, ISBN 978-0-13-009402-5, S. 353 ff. (books.google.com). [2]
  4. Eurovision Song Contest hält nun Guinness-Weltrekord. oe3.orf.at, 2015, zuletzt abgerufen 18. Jänner 2016. „Guinness World Records ist die weltweit anerkannte Institution zur Überprüfung und Beglaubigung von Weltrekorden und feiert dieses Jahr, genau wie der Eurovision Song Contest, sein 60. Jubiläum“