Zero-based numbering


Zero-based numbering is a way of numbering in which the initial element of a sequence is assigned the index 0, rather than the index 1 as is typical in everyday non-mathematical or non-programming circumstances. Under zero-based numbering, the initial element is sometimes termed the zeroth element, rather than the first element; zeroth is a coined word for the ordinal number zero. In some cases, an object or value that does not belong to a given sequence, but which could be naturally placed before its initial element, may be termed the zeroth element. There is no wide agreement regarding the correctness of using zero as an ordinal, as it creates ambiguity for all subsequent elements of the sequence when lacking context.
Numbering sequences starting at 0 is quite common in mathematics notation, in particular in combinatorics, though programming languages for mathematics usually index from 1. In computer science, array indices usually start at 0 in modern programming languages, so computer programmers might use zeroth in situations where others might use first, and so forth. In some mathematical contexts, zero-based numbering can be used without confusion, when ordinal forms have well established meaning with an obvious candidate to come before first; for instance, a zeroth derivative of a function is the function itself, obtained by differentiating zero times. Such usage corresponds to naming an element not properly belonging to the sequence but preceding it: the zeroth derivative is not really a derivative at all. However, just as the first derivative precedes the second derivative, so also does the zeroth derivative precede the first derivative.

Computer programming

Origin

, creator of the BCPL language, designed arrays initiating at 0 as the natural position to start accessing the array contents in the language, since the value of a pointer p used as an address accesses the position in memory. BCPL was first compiled for the IBM 7094; the language introduced no run-time indirection lookups, so the indirection optimization provided by these arrays was done at compile time. The optimization was nevertheless important.
In 1982 Edsger W. Dijkstra in his pertinent note Why numbering should start at zero argued that arrays subscripts should start at zero as that's the most natural number. Discussing possible designs of array ranges by enclosing them in a chained inequality, combining sharp and standard inequalities to four possibilities, demonstrating that to his conviction zero-based arrays are best represented by non-overlapping index ranges, which start at zero, alluding to open, half-open and closed intervals as with the real numbers. Dijkstra's criteria for preferring this convention are in detail that it represents empty sequences in a more natural way than closed "intervals", and that with half-open "intervals" of naturals, the length of a sub-sequence equals the upper minus the lower bound.

Usage in programming languages

This usage follows from design choices embedded in many influential programming languages, including C, Java, and Lisp. In these three, sequence types are indexed beginning with the zero subscript. Particularly in C, where arrays are closely tied to pointer arithmetic, this makes for a simpler implementation: the subscript refers to an offset from the starting position of an array, so the first element has an offset of zero.
Referencing memory by an address and an offset is represented directly in computer hardware on virtually all computer architectures, so this design detail in C makes compilation easier, at the cost of some human factors. In this context using "zeroth" as an ordinal is not strictly correct, but a widespread habit in this profession. Some programming languages, such as Fortran or COBOL, have array subscripts starting with one, because they were meant as high-level programming languages, and as such they had to have a correspondence to the usual ordinal numbers which predate the invention of the zero by a long time. And some programming languages, e.g., Ada, ALGOL 60, PL/I, allow an arbitrary lower bound for each index.
Pascal allows the range of an array to be of any ordinal type and Ada allows any discrete subtype. APL allows setting the index origin to 0 or 1 during runtime programmatically. Some more recent languages, such as Lua and Visual Basic, have adopted the same convention for the same reason.
Zero is the lowest unsigned integer value, one of the most fundamental types in programming and hardware design. In computer science, zero is thus often used as the base case for many kinds of numerical recursion. Proofs and other sorts of mathematical reasoning in computer science often begin with zero. For these reasons, in computer science it is not unusual to number from zero rather than one.
If an array is used to represent a cycle, it is convenient to obtain the index with a modulo function, which can result in zero.

Numerical properties

With zero-based numbering, a range can be expressed as the half-open interval,, as opposed to the closed interval,. Empty ranges, which often occur in algorithms, are tricky to express with a closed interval without resorting to obtuse conventions like. Because of this property, zero-based indexing potentially reduces off-by-one and fencepost errors. On the other hand, the repeat count is calculated in advance, making the use of counting from 0 to less intuitive. Some authors prefer one-based indexing, as it corresponds more closely to how entities are indexed in other contexts.
Another property of this convention is in the use of modular arithmetic as implemented in modern computers. Usually, the modulo function maps any integer modulo to one of the numbers, where. Because of this, many formulas in algorithms can be elegantly expressed in code using the modulo operation when array indices start at zero.
Pointer operations can also be expressed more elegantly on a zero-based index due to the underlying address/offset logic mentioned above. To illustrate, suppose is the memory address of the first element of an array, and is the index of the desired element. To compute the address of the desired element, if the index numbers count from 1, the desired address is computed by this expression:
where is the size of each element. In contrast, if the index numbers count from 0, the expression becomes
This simpler expression is more efficient to compute at run time.
However, a language wishing to index arrays from 1 could adopt the convention that every array address is represented by ; that is, rather than using the address of the first array element, such a language would use the address of a fictitious element located immediately before the first actual element. The indexing expression for a 1-based index would then be
Hence, the efficiency benefit at run time of zero-based indexing is not inherent, but is an artifact of the decision to represent an array with the address of its first element rather than the address of the fictitious zeroth element. However, the address of that fictitious element could very well be the address of some other item in memory not related to the array.
Superficially, the fictitious element doesn't scale well to multidimensional arrays. Indexing multidimensional arrays from zero makes a naive conversion to a linear address space look simpler than when indexing from one. For instance, when mapping the three-dimensional array to a linear array, both with elements, the index in the linear array to access a specific element with in zero-based indexing, i.e.,,, and, is calculated by
Organizing all arrays with 1-based indices, and assuming an analogous arrangement of the elements, gives
to access the same element, which arguably looks more complicated. Of course, since and A simple and everyday-life example is positional notation, which the invention of the zero made possible. In positional notation, tens, hundreds, thousands and all other digits start with zero, only units start at one.





This situation can lead to some confusion in terminology. In a zero-based indexing scheme, the first element is "element number zero"; likewise, the twelfth element is "element number eleven". Therefore, an analogy from the ordinal numbers to the quantity of objects numbered appears; the highest index of objects will be, and it refers to the th element. For this reason, the first element is sometimes referred to as the zeroth element, in an attempt to avoid confusion.

Science

In mathematics, many sequences of numbers or of polynomials are indexed by nonnegative integers, for example, the Bernoulli numbers and the Bell numbers.
In both mechanics and statistics, the zeroth moment is defined, representing total mass in the case of physical density, or total probability, i.e. one, for a probability distribution.
The zeroth law of thermodynamics was formulated after the first, second, and third laws, but considered more fundamental, thus its name.
In biology, an organism is said to have zero-order intentionality if it shows "no intention of anything at all". This would include a situation where the organism's genetically predetermined phenotype results in a fitness benefit to itself, because it did not "intend" to express its genes. In the similar sense, a computer may be considered from this perspective a zero-order intentional entity, as it does not "intend" to express the code of the programs it runs.
In biological or medical experiments, the first day of an experiment is often numbered as day 0.
Patient zero is the initial patient in the population sample of an epidemiological investigation.