Zaunpfahlfehler

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Zaunpfahlproblem)
Zur Navigation springen Zur Suche springen

Ein Zaunpfahlfehler (von englisch fencepost error) ist ein Fehler, der aus einer Verwechslung der Anzahl der Objekte in einer Reihe mit der Anzahl der Räume zwischen diesen Objekten entsteht. Das Ergebnis ist dadurch entweder um eins zu klein oder um eins zu groß. Ein Zaunpfahlfehler führt somit im Ergebnis zu einem Um-eins-daneben-Fehler.

Der Begriff entstand in der Informatik, wo er auch am häufigsten verwendet wird.[1][2][3]

Zaunpfahlprobleme alias -fehler gibt es aber in allen Lebensbereichen. Ihre Bezeichnung stammt davon, dass sie bei der Berechnung eines aus Pfählen und Zwischenfeldern bestehenden Zauns auftreten können. Ein typischer Zaunpfahlfehler ist, die Anzahl der Zwischenfelder mit der Zahl der Pfähle gleichsetzen zu wollen. Die Anzahl der Zwischenräume ist bei einem (nicht ringförmig geschlossenen) Zaun stets um 1 kleiner als die Zahl der Pfähle.

Illustration des Zaunpfahlproblems an einem Zaun:
Zwischen 11 Pfählen (allgemein: Objekten) lassen sich nicht 11, sondern nur 10 Zaunsegmente (allgemein: Zwischenräume, die hier zu füllen sind) montieren.

Nummerieren, Zählen, Subtrahieren[Bearbeiten | Quelltext bearbeiten]

Betrachtet man zum Beispiel einen Bereich, der durch die Objekte Nummer 1 bis 11 in einer aufsteigenden Folge definiert ist, so gilt:

  • Die Differenz der Nummern, im Beispiel 11 − 1 = 10, ist die Anzahl der Zwischenräume.
  • Die Differenz der Nummern plus 1, im Beispiel 11 − 1 + 1 = 11, ist die Anzahl der betrachteten Objekte.
Bei einem Maßband entspricht die Vorderkante mit dem Wert 0 cm einem Objekt mit der Nummer 0. Auf diese Weise (mit 0 beginnende Nummerierung) entsprechen die folgenden Nummern (Werte in cm) der ab Vorderkante gezählten Zwischenräume (je 1 cm) und somit der gemessenen Länge.

Um bei einer Folge von Objekten die Anzahl der Zwischenräume ohne Rechnung, nur durch Abzählen, zu ermitteln, bietet sich an, mit dem Start-Objekt als 0 zu zählen zu beginnen,[4] bzw. das Startobjekt beim Abzählen der Objekte auszulassen. Dann entspricht die Nummer des End-Objektes der Zahl der Zwischenräume. Das nebenstehende Bild des Maßbands veranschaulicht diese Methode: das Maßband wird nicht mit der Markierung 1, sondern mit der Vorderkante, die dem Wert 0 entspricht, angelegt, um den Abstand zweier Punkte (= die Anzahl der Zwischenräume in einer bestimmten Längeneinheit, z. B. 1 cm) zu ermitteln.

Um dagegen die Objekte selbst zu zählen, bietet es sich an, mit dem Start-Objekt als 1 zu zählen zu beginnen. Dann entspricht die Nummer des End-Objekts der Anzahl der Objekte. Werden die Zählweisen verwechselt, so liegt ein Zaunpfahlfehler vor.

Haben die Objekte konstante Abstände von bekannter Größe, so lässt sich der Abstand zweier Objekte aus der Anzahl der Zwischenräume multipliziert mit der Größe der Zwischenräume (das heißt, dem Abstand benachbarter Objekte) berechnen. Im Beispiel des Maßbands ist die Größe der Zwischenräume 1 cm. Im Beispiel des obigen Zauns ergibt sich unter der Annahme, dass die Zaunpfähle jeweils 3 Meter auseinander stehen, zwischen dem ersten und letzten Pfahl der Abstand von (11 − 1) × 3 m = 30 m. Das ist die Zaunlänge.

Informatik[Bearbeiten | Quelltext bearbeiten]

Zaunpfahlfehler zeigen sich oft in einem Zahlenwert, der um 1 zu groß oder zu klein ist. In der Informatik nennt man solche Fehler auch Off-by-one-Errors. Sie zeigen sich aber auch oft in einem Zahlenwert, der um einen bestimmten Offset (die Distanz von Teilobjekten) zu groß oder zu klein ist, etwa bei einem Zeiger.

Sie gehören folgenden Hauptgruppen an:

  1. Verwechslung von Distanzen und Anzahlen.
  2. Wenn es um den Abstand von Elementen in einer Sequenz geht, muss sich der Softwareentwickler im Klaren darüber sein, ob eines oder beide Grenzelemente mitgezählt werden oder nicht.
  3. Zählung ab 0 oder ab 1: Im Alltag beginnen Menschen Aufzählungen meist bei 1, in vielen Programmiersprachen wie C oder Java beginnen jedoch Indexierungen 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[Bearbeiten | Quelltext bearbeiten]

Die historische Inklusivzählung[Bearbeiten | Quelltext bearbeiten]

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.

Zeitrechnung[Bearbeiten | Quelltext bearbeiten]

Jahr null[Bearbeiten | Quelltext bearbeiten]

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 und Ähnliches[Bearbeiten | Quelltext bearbeiten]

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 Englischen werden neben der normalen Bezeichnung der Jahrhunderte (20th century) auch umgangssprachlich die Jahrhunderte so benannt, dass 1900s (gesprochen „nineteen-hundreds“) den Zeitraum von 1900 bis 1999 bezeichnet. Auch beispielsweise im Italienischen gibt es neben XX secolo die Möglichkeit, mit Novecento (wörtlich: „neunhundert“) den Zeitraum 1900–1999 zu bezeichnen (dies ist jedoch nur für Jahrhunderte ab dem Jahr 1100 möglich). Analog verhält es sich im deutschsprachigen Raum mit den Jahrzehnten: Das erste Dezennium des 21. Jahrhunderts umfasst den Zeitraum 1. Januar 2001 bis 31. Dezember 2010, aber der Begriff 2000er Jahre umfasst im Sinne des Ausdrucks 1. Januar 2000 bis 31. Dezember 2009.

Im Hinblick auf die nunmehr auftauchende „2“ am Anfang der Jahreszahl 2000 wurde dies (kalendarisch-)rechnerisch falsch mit dem Begriff Jahrtausendwende emotional gleich gesetzt und dieser für den Jahreswechsel 1999/2000 verwendet, was der Grund dafür war, warum bereits in der Silvesternacht vom 31. Dezember 1999 auf den 1. Januar 2000 weltweit der Anbruch des neuen Jahrtausends mit zahlreichen eindrucksvollen Veranstaltungen intensiv gefeiert wurde.

Jahrestage[Bearbeiten | Quelltext bearbeiten]

Jahrestage sind die Wiederkehr eines Ereignisses nach jeweils einem vollen Jahr: 1. Jahrestag nach einem Jahr, 2. Jahrestag nach zwei Jahren usw., seit dem Ereignis.

Ein Beispiel ist der Geburtstag, der ein Jahrestag des Ereignisses der Geburt ist. So gilt z. B.: 50. Geburtstag = 50. Jahrestag (nach fünfzig vollendeten Lebensjahren), Tag der Geburt = „0. Geburtstag“ = „0. Jahrestag“, ähnlich wie die Markierung 0 auf einem Zentimetermaß. Die anderen Markierungen entsprechen der Nummer des Geburtstages, die Lücken der Nummer des gegenwärtigen Lebensjahres. Zählt man das zu gedenkende Ereignis Geburt der Nummer des Gedenktages (Geburtstag) hinzu, so zeigt sich das Zaunpfahlproblem: Die Zahl der Ereignisse (Objekte) ist um 1 größer als die Zahl der Jahre (Zwischenräume).

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. der chinesischen Kultur, ist das hingegen anders. Dort wird für Altersangaben nicht gezählt, wie lange ein Mensch auf der Welt ist, sondern in wie vielen Kalenderjahren (entsprechend dem dortigen Kalender) er gelebt hat. Im chinesischen Kalender ist der Jahreswechsel das chinesische Neujahrsfest. Daher ist in China ein Neugeborenes am Tag seiner Geburt bereits „1 Jahr alt“ und an seinem ersten Neujahrsfest wird das Kind bereits „2 Jahre alt“, auch wenn es noch keine 12 Monate auf der Welt ist.[5]

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.[6]

Jahr 1955 1956 1957 ... 1964 1965 ... 2014 2015
Guinness-Buch Nr. 1 2 3 ... 10 11 ... 60 61
Eurovision Song Contest Nr. - 1 2 .. 9 10 ... 59 60

Finden der Mitte[Bearbeiten | Quelltext bearbeiten]

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 512:

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 212 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) = 512.

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[Bearbeiten | Quelltext bearbeiten]

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 ehemaligen Sowjetunion, beginnt die Zählung bereits mit dem Erdgeschoss als der Nummer 1. Auch wenn in Deutschland statt Stockwerken Ebenen durchnummeriert werden, wird dabei oft schon im Erdgeschoss mit dem Zählen bei Ebene 1 angefangen.

Bei drei oder auf drei und dann?[Bearbeiten | Quelltext bearbeiten]

„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[Bearbeiten | Quelltext bearbeiten]

  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. Das war im Altertum nicht möglich, weil die Null nicht bekannt war. Im Altertum galt bei der Betrachtung von Zeiträumen und Abständen die Inklusivzählung, die das Anfangsobjekt einbezog (siehe unten).
  5. Diese abweichende Altersrechnung hat nichts damit zu tun, dass der Geburt des Kindes eine ca. neunmonatige Zeit während der Schwangerschaft seiner Mutter vorausgeht.
  6. 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“