Нумерация с нулевой базой — это способ нумерации , при котором начальному элементу последовательности присваивается индекс , а не индекс 1, как это типично в повседневных нематематических или непрограммистских обстоятельствах. При нумерации с нулевой базой начальный элемент иногда называют нулевым элементом [1] , а не первым элементом; нулевой — это придуманное порядковое число, соответствующее числу ноль . В некоторых случаях объект или значение, которое (изначально) не принадлежит данной последовательности, но которое может быть естественным образом размещено перед его начальным элементом, может быть названо нулевым элементом. Нет широкого согласия относительно правильности использования нуля в качестве порядкового числа (как и относительно использования термина нулевой ), поскольку это создает двусмысленность для всех последующих элементов последовательности при отсутствии контекста.
Нумерация последовательностей, начинающихся с 0 , довольно распространена в математической нотации, в частности в комбинаторике , хотя языки программирования для математики обычно индексируют с 1. [2] [3] [4] В информатике индексы массивов обычно начинаются с 0 в современных языках программирования, поэтому программисты могут использовать zeroth в ситуациях, когда другие могут использовать first и т. д. В некоторых математических контекстах нумерация, начинающаяся с нуля, может использоваться без путаницы, когда порядковые формы имеют хорошо устоявшееся значение с очевидным кандидатом, который должен стоять перед first ; например, нулевая производная функции — это сама функция, полученная путем дифференцирования ноль раз. Такое использование соответствует именованию элемента, не принадлежащего последовательности должным образом, но предшествующего ей: нулевая производная на самом деле вообще не является производной. Однако, как первая производная предшествует второй производной , так и нулевая производная (или сама исходная функция) предшествует первой производной .
Мартин Ричардс , создатель языка BCPL (предшественника C ), разработал массивы, начинающиеся с 0 как естественной позиции для начала доступа к содержимому массива в языке, поскольку значение указателя p, используемого в качестве адреса, обращается к позиции p + 0 в памяти. [5] [6] BCPL был впервые скомпилирован для IBM 7094 ; язык не вводил косвенных поисков во время выполнения , поэтому оптимизация косвенности, предоставляемая этими массивами, выполнялась во время компиляции. [6] Тем не менее, оптимизация была важна. [6] [7]
В 1982 году Эдсгер В. Дейкстра в своей соответствующей заметке Почему нумерация должна начинаться с нуля [8] утверждал, что индексы массивов должны начинаться с нуля, поскольку последний является наиболее натуральным числом . Обсуждая возможные конструкции диапазонов массивов, заключая их в цепочку неравенств, объединяя точные и стандартные неравенства в четыре возможности, демонстрируя, что, по его убеждению, массивы с нулевой базой лучше всего представлены неперекрывающимися диапазонами индексов, которые начинаются с нуля, намекая на открытые, полуоткрытые и закрытые интервалы, как и в случае с действительными числами. Критерии Дейкстры, по которым он отдает предпочтение этому соглашению, в частности, состоят в том, что оно представляет пустые последовательности более естественным образом ( a ≤ i < a ?) , чем закрытые «интервалы» ( a ≤ i ≤ ( a − 1) ? ), и что при полуоткрытых «интервалах» натуральных чисел длина подпоследовательности равна верхней минус нижней границе ( a ≤ i < b дает ( b − a ) возможных значений для i , где a , b , i все целые числа).
Такое использование следует из выбора дизайна, встроенного во многие влиятельные языки программирования , включая C , Java и Lisp . В этих трех типах последовательностей (массивы C, массивы и списки Java, а также списки и векторы Lisp) индексируются, начиная с нулевого индекса. В частности, в C, где массивы тесно связаны с арифметикой указателей , это упрощает реализацию: индекс ссылается на смещение от начальной позиции массива, поэтому первый элемент имеет смещение, равное нулю.
Обращение к памяти по адресу и смещению представлено непосредственно в компьютерном оборудовании практически на всех компьютерных архитектурах, поэтому эта деталь дизайна в C упрощает компиляцию за счет некоторых человеческих факторов. В этом контексте использование «нуля» в качестве порядкового числа не является строго правильным, но широко распространенной привычкой в этой профессии. В других языках программирования, таких как Fortran или COBOL , индексы массивов начинаются с единицы, поскольку они были задуманы как языки программирования высокого уровня , и как таковые они должны были иметь соответствие обычным порядковым числам , которые появились задолго до изобретения нуля .
Pascal позволяет диапазону массива быть любого порядкового типа (включая перечислимые типы). APL позволяет программно устанавливать начало индекса на 0 или 1 во время выполнения. [9] [10] Некоторые современные языки, такие как Lua и Visual Basic , приняли то же соглашение по той же причине.
Ноль — наименьшее беззнаковое целое число, один из самых фундаментальных типов в программировании и проектировании оборудования. В информатике ноль часто используется как базовый случай для многих видов числовой рекурсии . Доказательства и другие виды математических рассуждений в информатике часто начинаются с нуля. По этим причинам в информатике не является чем-то необычным нумеровать с нуля, а не с единицы.
Если для представления цикла используется массив, то индекс удобно получить с помощью функции по модулю , что может дать ноль.
При нумерации с нуля диапазон может быть выражен как полуоткрытый интервал [0, n ) , в отличие от закрытого интервала [1, n ] . Пустые диапазоны, которые часто встречаются в алгоритмах, сложно выразить с помощью закрытого интервала, не прибегая к тупым соглашениям, таким как [1, 0] . Из-за этого свойства индексация с нуля потенциально снижает ошибки «off-by-one» и «fencepost» . [8] С другой стороны, количество повторений n вычисляется заранее, что делает использование подсчета от 0 до n − 1 (включительно) менее интуитивным. Некоторые авторы предпочитают индексацию с единицы, так как она более точно соответствует тому, как индексируются сущности в других контекстах. [11]
Другое свойство этого соглашения заключается в использовании модульной арифметики , реализованной в современных компьютерах. Обычно функция modulo отображает любое целое число по модулю N в одно из чисел 0, 1, 2, ..., N − 1 , где N ≥ 1. Благодаря этому многие формулы в алгоритмах (например, для вычисления индексов хэш-таблицы) можно элегантно выразить в коде с помощью операции modulo, когда индексы массива начинаются с нуля.
Операции указателя также могут быть выражены более элегантно на индексе, начинающемся с нуля, благодаря базовой логике адреса/смещения, упомянутой выше. Для иллюстрации предположим, что a — это адрес памяти первого элемента массива, а i — индекс нужного элемента. Чтобы вычислить адрес нужного элемента, если индексные номера отсчитываются от 1, нужный адрес вычисляется с помощью этого выражения:
где s — размер каждого элемента. Напротив, если индексные числа отсчитываются от 0, выражение становится
Это более простое выражение более эффективно для вычисления во время выполнения .
Однако язык, желающий индексировать массивы с 1, может принять соглашение, что каждый адрес массива представлен как a ′ = a – s ; то есть, вместо использования адреса первого элемента массива, такой язык будет использовать адрес фиктивного элемента, расположенного непосредственно перед первым фактическим элементом. Выражение индексирования для индекса, основанного на 1, тогда будет
Таким образом, преимущество эффективности во время выполнения индексации с нулевой базой не является неотъемлемым, а является артефактом решения представлять массив адресом его первого элемента, а не адресом фиктивного нулевого элемента. Однако адрес этого фиктивного элемента вполне может быть адресом какого-то другого элемента в памяти, не связанного с массивом.
На первый взгляд, фиктивный элемент плохо масштабируется для многомерных массивов. Индексация многомерных массивов с нуля делает наивное (непрерывное) преобразование в линейное адресное пространство (систематическое изменение одного индекса за другим) более простым, чем при индексации с единицы. Например, при отображении трехмерного массива A[ P ][ N ][ M ] в линейный массив L[ M⋅N⋅P ] , оба с M ⋅ N ⋅ P элементами, индекс r в линейном массиве для доступа к определенному элементу с L[ r ] = A[ z ][ y ][ x ] в индексации с отсчетом от нуля, т. е. [0 ≤ x < P ] , [0 ≤ y < N ] , [0 ≤ z < M ] и [0 ≤ r < M ⋅ N ⋅ P ] , вычисляется следующим образом:
Организация всех массивов с индексами, начинающимися с 1 ( [1 ≤ x′ ≤ P ] , [1 ≤ y′ ≤ N ] , [1 ≤ z′ ≤ M ] , [1 ≤ r′ ≤ M ⋅ N ⋅ P ] ) и предположение об аналогичном расположении элементов дает
для доступа к тому же элементу, что, возможно, выглядит более сложным. Конечно, r ′ = r + 1, так как [ z = z ′ – 1], [ y = y ′ – 1] и [ x = x ′ – 1]. Простой и повседневный пример – позиционная нотация , которая стала возможной благодаря изобретению нуля. В позиционной нотации десятки, сотни, тысячи и все остальные цифры начинаются с нуля, только единицы начинаются с единицы. [12]
Такая ситуация может привести к некоторой путанице в терминологии. В нулевой схеме индексации первым элементом является «элемент номер ноль»; аналогично, двенадцатым элементом является «элемент номер одиннадцать». Поэтому возникает аналогия от порядковых номеров к количеству пронумерованных объектов; наибольший индекс из n объектов будет n − 1 , и он относится к n -му элементу. По этой причине первый элемент иногда называют нулевым элементом, чтобы избежать путаницы.
В математике многие последовательности чисел или многочленов индексируются неотрицательными целыми числами, например, числами Бернулли и числами Белла .
И в механике , и в статистике определяется нулевой момент , представляющий собой полную массу в случае физической плотности , или полную вероятность, т. е. единицу, для распределения вероятностей .
Нулевой закон термодинамики был сформулирован после первого, второго и третьего законов, но считается более фундаментальным, отсюда и его название.
В биологии говорят, что организм имеет интенциональность нулевого порядка, если он не проявляет «никакого намерения вообще чего-либо». Это включает ситуацию, когда генетически предопределенный фенотип организма приводит к выгоде для него самого, потому что он не «намеревался» выражать свои гены. [13] В аналогичном смысле компьютер можно считать с этой точки зрения интенциональной сущностью нулевого порядка, поскольку он не «намеревается» выражать код программ, которые он запускает. [14]
В биологических или медицинских экспериментах первый день эксперимента часто обозначается как день 0. [15]
Нулевой пациент (или индексный случай ) — это начальный пациент в выборке населения эпидемиологического исследования.
Нулевой год отсутствует в широко используемом григорианском календаре или в его предшественнике, юлианском календаре . В этих системах за 1 годом до н. э. следует 1 год н. э . Однако нулевой год есть в астрономической нумерации лет (где он совпадает с юлианским годом 1 до н. э.) и в ISO 8601:2004 (где он совпадает с григорианским годом 1 до н. э.), а также во всех буддийских и индуистских календарях .
Во многих странах первый этаж в зданиях считается этажом номер 0, а не "1-м этажом", как принято в Соединенных Штатах Америки. Это создает согласованный набор с подземными этажами, обозначенными отрицательными числами.
Хотя порядковый номер 0 в основном находит применение в сообществах, напрямую связанных с математикой, физикой и информатикой, есть также примеры в классической музыке. Композитор Антон Брукнер считал свою раннюю Симфонию ре минор недостойной включения в канон своих произведений, и он написал gilt nicht («не считается») на партитуре и круг с перекладиной, намереваясь это означать «недействительный». Но посмертно это произведение стало известно как Симфония № 0 ре минор , хотя на самом деле оно было написано после Симфонии № 1 до минор . Существует еще более ранняя Симфония фа минор Брукнера, которую иногда называют № 00. Русский композитор Альфред Шнитке также написал Симфонию № 0 .
В некоторых университетах, включая Оксфорд и Кембридж, "week 0" или иногда "noughth week" относится к неделе перед первой неделей лекций в семестре. В Австралии некоторые университеты называют это "O week", что является каламбуром на " orientation week ". В качестве параллели вводные недели в университетском образовании в Швеции обычно называются nollning (обнуление).
ВВС США начинают базовую подготовку каждую среду, и первая неделя (из восьми) считается начинающейся со следующего воскресенья. Четыре дня до этого воскресенья часто называют «нулевой неделей».
24-часовые часы и международный стандарт ISO 8601 используют 0 для обозначения первого (нулевого) часа дня, что согласуется с использованием 0 для обозначения первой (нулевой) минуты часа и первой (нулевой) секунды минуты. Кроме того, 12-часовые часы, используемые в Японии, используют 0 для обозначения часа сразу после полуночи и полудня в отличие от 12, используемых в других местах, чтобы избежать путаницы, представляют ли 12 am и 12 pm полдень или полночь .
Рисунки Роберта Крамба для первого выпуска Zap Comix были украдены, поэтому он нарисовал совершенно новый выпуск, который был опубликован как выпуск 1. Позже он перерисовал свои фотокопии украденных работ и опубликовал его как выпуск 0.
Брюссельская кольцевая дорога в Бельгии имеет номер R0. Она была построена после кольцевой дороги вокруг Антверпена , но Брюссель (будучи столицей) был признан заслуживающим более простого номера. Аналогично (недостроенная) кольцевая автомагистраль вокруг Будапешта в Венгрии называется M0 .
Ноль иногда используется в уличных адресах , особенно в схемах, где четные числа — это одна сторона улицы, а нечетные — другая. Примером может служить Крайст-Черч на Гарвард-сквер , адрес которой — 0 Garden Street.
Раньше в Формуле-1 , когда действующий чемпион мира не выступал в следующем сезоне, номер 1 не присваивался ни одному гонщику, но один гонщик из команды чемпионов мира носил номер 0, а другой — номер 2. Это случалось и в 1993, и в 1994 годах, когда Дэймон Хилл носил номер 0 в обоих сезонах, поскольку действующий чемпион Найджел Мэнселл ушел после 1992 года, а действующий чемпион Ален Прост ушел после 1993 года. Однако в 2014 году серия перешла к гонщикам, носящим персонализированные номера на протяжении всей карьеры, вместо номеров, выделенных команде, за исключением того, что действующий чемпион по-прежнему имел возможность носить номер 1. Поэтому 0 больше не используется в этом сценарии. Неясно, доступен ли он как выбранный гонщиком номер или он должен быть в диапазоне от 2 до 99, но до настоящего времени он не использовался в рамках этой системы.
В некоторых командных видах спорта допускается выбор 0 в качестве номера на форме игрока (в дополнение к типичному диапазону от 1 до 99). НФЛ проголосовала за то, чтобы разрешить это с 2023 года.
Хронологический приквел серии может иметь номер 0, например, Ring 0: Birthday или Zork Zero .
Швейцарские федеральные железные дороги нумеруют некоторые классы подвижного состава от нуля, например, Re 460 000 до 118.
В области фантастики Айзек Азимов в конечном итоге добавил Нулевой закон к своим Трем законам робототехники , по сути сделав их четырьмя законами.
Стандартное колесо рулетки содержит число 0, а также 1-36. Оно отображается зеленым цветом, поэтому не классифицируется ни как «красное», ни как «черное» число для целей ставок. В карточной игре Uno есть числовые карты от 0 до 9 вместе со специальными картами в каждой цветной масти.
Четыре основные свободы свободного ПО нумеруются, начиная с нуля. Это обусловлено историческими причинами: изначально в списке было всего три свободы, а когда была добавлена четвертая, она оказалась на нулевой позиции, поскольку считалась более базовой.
Название на Youtube: Числовая сетка / Подсчет / Ранняя математика / Khan Academy.