Шумеро-вавилонские клинописные глиняные таблички из Месопотамии содержат древнейшие известные математические тексты. Некоторым из них по пять тысяч лет и более.
Шумеро-вавилонская клинописная цифра 42 выглядит так: . И это именно цифра, которой может соответствовать и число 
, и 
, и 
 и так далее, по степеням 60. В том числе, по обратным степеням, например: 
, 
.
Шрифты и клинопись
Если в этом тексте через веб не отображается клинопись, то это из-за отсутствия шрифтов; добавьте шрифты с клинописным блоком, cuneiform; например - Noto.
В шумеро-вавилонской Месопотамии использовали шестидесятеричную систему. То есть, позиционную систему по основанию шестьдесят: каждой позиции соответствует количество единиц, умноженное на степень 60, веса по позициям суммируются. Обычный способ. Поскольку основание , то нужно 59 цифр. Откуда и цифра 42 (конечно, 42 тут - это условное обозначение, поэтому к нему даже можно не приписывать нижний индекс 
). В клинописной записи отдельных цифр вертикальные «палки» обозначают единицы, если их количество не превышает 9, а «галки» - обозначают десятки, что, впрочем, не делает систему десятеричной.
Вообще, древнейшние шумерские системы счисления использовали для записи цифр круги и «полуовалы». «Галки» и «палки» появились позднее, когда система стала логически стройнее. К тому же, протоклинописных кругов и «полуовалов» всё ещё нет в Unicode. При этом, в самых древних шумерских вариантах интерпретация цифр зависела ещё и от того, что именно подсчитывается: использовался ли знак для обозначения мер зерновых, для записи количества кувшинов масла или площади земельного надела - числовое значение могло быть разным. Это в точности современный Javascript, неявно преобразующий строку в числовой тип.
Преобразование типов и пиво
Это эквивалентные операции, не сомневайтесь. Многие неотъемлемые части информационных технологий очень древние. Предположим, что неявное преобразование типов приводит ASCII-код записи "42" в значение целочисленного типа 42. Это означает, что последовательность байтов 0x3432, превращается в 0x2A. Но парой байтов были обозначены ASCII-символы. У древнейших шумер были бы, предположим, кувшины с пивом, а не ASCII-символы. Не удивительно, что эффект был позднее исправлен (не в Javascript, который хорош и без пива).
Шумеро-вавилонская система счисления имеет целый ряд особенностей. Например, способ записи не подразумевал явного обозначения степени конкретной позиции: сколько там весит единица - ,
 - всё определялось контекстом. Таким образом, это древнейшая система с плавающей точкой! И она на несколько тысяч лет старше всем привычных float, double, как и современных стандартов «плавающей точки» вообще. Впрочем, если в современных стандартах бывает два нуля, - вообще говоря, не равных друг другу, - то в шумеро-вавилонской системе настоящего нуля, как такового, вообще не было, хоть в поздних вариантах и появился знак для заполнения пустых разрядов.
Выбор числа  в качестве основания имеет арифметическое обоснование. У шестидесятеричной системы большое преимущество, если сранивать, например, с десятеричной, а тем более - с двоичной, восьмеричной и шестнадцатеричной. Всё потому, что число шестьдесят - «очень непростое»: 
. Арифметика записи по основанию шестьдесят оказывается удобной для учёта привычных долей - можно самые ходовые доли записать точно: 
, 
, 
, 
, 
, 
, 
, 
, 
, 
.
Итак, разберёмся с шумерскими цифрами. Цифрами служили комбинации клинописных знаков. Мы уже назвали их «галки» и «палки», соответственно внешнего вида в Unicode и на табличках.  - это "галка", которая соответствует десяти единицам;
 - это «палка», которая соответствует единице. Единицы в количестве менее десяти записывались в виде плотного набора «палок»: 
 - это семь. 
 - это цифра, которой в единицах соответствует число 
. «Галки» повторялись кратно десяти. 
В зависимости от позиции и от контекста цифра 23 может обозначать единицы, то есть нулевую степень основания , или единицы при 
, или единицы при 
. Соответственно,
 (23) в позиции единиц - это 
. 
 в позиции 
 это 
. А для второй степени: 
. 
Позиции разделялись пробелами, что не всегда однозначно, так как нуля в классическом варианте не было.  это, например, 
. Почему "например"? Потому что это система с плавающей точкой.
 с тем же успехом можно интерпретировать как 
. 
Эта особенность сильно помогает при практических вычислениях, но мешает при считывании результата спустя всего лишь три-четыре тысячи лет. Всё достаточно просто. Различать клинья на реальных табличках трудно, но не схему записи.
Использование шумерской шестидесятеричной системы счисления в точности являлось прикладным случаем того, что сейчас принято называть «компьютерными науками» (computer science). Поэтому очень полезен сравнительный взгляд, учитывающий другие позиционные системы счисления, используемые в информатике и в тех самых компьютерных науках сейчас.
Старинная шутка гласит, что типов людей всего 10 - одни уже знают двоичную систему счисления, а другие - ещё нет. Система счисления - это способ записи чисел. Разные системы хорошо подходят для разных целей. Так, двоичная система подходит не только для записи шуток (), но и служит неплохим математическим фундаментом «железячных» компьютерных вычислений: компьютеры, как известно, не считают, а переключают транзисторные «флип-флопы». Успешная интерпретация таких переключений возможна только потому, что есть двоичная система счисления.
Использование систем счисления с разными основаниями является привычной практикой: кроме двоичной и десятичной, распространены восьмеричная и шестнадцатеричная. Восьмеричная система, конечно, встречается нынче реже, чем шестнадцатеричная, но всё равно постоянно присутствует рядом с вами, если вы сетевой инженер или разработчик системного ПО. Например, один из штатных способов записи IP-адреса, при вызове тех или иных утилит, использует восьмеричную систему, вот так: 010.010.010.010 - это будет 8.8.8.8 в привычной форме по основанию 10 (десять). Согласно древнему соглашению, октет IPv4-адреса, начинающийся с нуля, интерпретируется как записанный в восьмеричной системе. На табличках из Месопотамии об этом ничего не сказано, но, из-за базовых unix-библиотек, такое преобразование сейчас касается не только октетов.
А вот шестнадцатеричная система вряд ли нуждается в примерах: этот вариант встречается в практике программирования почти столь же часто, как и система десятичная. И не только в программировании. На стороне веб-фронтендеров в шестнадцатеричной системе повсеместно записываются цвета внутри каскадных таблиц стилей (CSS) - загляните хоть бы и в исходный код веб-страниц «Хабра». По основанию очень удобно записывать байтовые маски: запись получается не такой длинной, как в двоичной, а один октет укладывается в две цифры.
Более того, каждую шестнадцатеричную цифру полубайта можно выкинуть на четырёх пальцах руки, перпендикулярных большому пальцу: 0xF - все четыре пальца. 0x8 - указательный или мизинец, в зависимости от того, «тупоконечные» у вас пальцы или «остроконечные». Не в смысле формы, а в смысле, с какой стороны старший бит байта. При работе с древними компьютерами (не глиняными, но примерно того же поколения) правильная шестнадцатеричная распальцовка сильно ускоряла набор на битовых переключателях. Нынче навык сей доступен разве что редкому динозавру-технарю, да и не так полезен, однако верная распальцовка всё ещё может быть эффективно использована в беседе с молодыми DevOps, для пущего их убеждения.
Не факт, что старшинство указательного пальца, взятое по модулю «хиральности» (правой/левой руки), оказало влияние на развитие систем счисления. Но вполне возможно, что принцип счёта по трём фалангам каждого из четырёх пальцев прямо связан с двенадцатеричными системами, которые мы здесь не рассматриваем. Впрочем, как раз .
Выше мы заметили, что основание 60 позволяет едва ли не каждую привычную на практике долю записать точно. Благодаря этой возможности шестидесятеричная система превосходит десятеричную и другие системы. Разберёмся, что именно тут имеется в виду.
Всякую позиционную систему счисления можно использовать для записи дробей: возьмём обратные степени основания {-1, -2, -3...} и станем записывать дробную часть, отделив её от целой каким-нибудь знаком. Точкой, например. Это уже было проделано выше. Для десяти - получаем всем привычные десятичные дроби: 0.4242. Точно так же будут работать и двоичная, и восьмеричная, и шестнадцатеричная система. Нет разницы. Только вот с записью долей таким способом возникнет сложность иного рода: запись окажется «бесконечной вправо» (ну, если записывать числа и расставлять веса справа налево; «бесконечная влево» запись - это p-адические числа, другая тема, хоть и неожиданно близкая).
Так, 16 - это . То есть, основание шестнадцатеричной системы, при всём богатстве выбора, какое-то слишком "простое", и проблемы начнутся с нечётными знаменателями в долях вида 
.
Например,  - всё в шестнадцатеричной системе, а тройка здесь - в периоде (обозначается скобками). «В периоде» - это значит, что развернутая запись никогда не окончится. Однако в десятичной записи 
. «Периода» нет, запись терминируется тут же. И это одно и то же рациональное число - одна пятая.
Да, формально, и , благодаря возможности обозначить «периодические цифры», - это точная конечная запись для 
. Да, к 
, если уж быть максимально строгим, должен быть приписан бесконечный хвост нулей - 0.2(0), но его принято не указывать (да вообще мало кто помнит, что он там есть, но его не видно; как и про второе представление с бесконечно повторяющимися девятками, для десятичной системы). Это всё так по определению, а требуется по тем же причинам, по которым в десятеричной (десятичной) системе 
.
Казалось бы, сложно ли записать (3) как период? Всего лишь скобки. Однако проблема в том, что длина периодической части может быть произвольной, не обязательно лишь одна цифра повторяется.
Заметьте, что . Аналогично тому, как 
. Но почему в десятичной системе 
? Потому что 
. Соответственно, все числа, представимые в виде 
, будут регулярными в десятичной системе: «обратные» к ним можно записать в виде конечной дроби. Шестнадцатеричная же система имеет основание 
, а число 5 нельзя представить в виде 
, отсюда и десятичная часть в периоде.
По тем же причинам и . Три цифры период.
А вот для  период записи после запятой составит 847425747 шестнадцатеричных цифр (проверьте на калькуляторе). Так что проблема точной записи, даже если позволяется вводить дополнительную структуру и указывать «период» в скобках, - остаётся. Кстати, поскольку в разложении 10 есть 2, то найти столь же иллюстративный обратный пример - число, которое «хорошо» представляется в десятичной системе, но «плохо» в шестнадцатеричной, - не выйдет.
Будем обозначать клинописные цифры десятичной записью соответствующего числа, разделять цифры будем запятой «,», а точку-разделитель целой и дробной части (мантиссы) - обозначим точкой с запятой («;»). Это общепринятый сейчас способ. Тогда  в шестидесятеричной шумеро-вавилонской системе это 0; 8,34,17(,8,34,17) или, если клинописью, 
 (сила Unicode; которая хороша там, где реально требуется).
А что ещё за «обратные»? Например, в десятеричной системе деление на два эквивалентно умножению на пять с последующим сдвигом десятичной точки. Элементарный пример: . В шестидесятеричной системе основание делится не только на 2 и 5, но ещё и на 3. В шестидесятеричной системе регулярные числа - это все те, которые представимы в виде 
. Здесь много делителей: [
, 
, 
, 
, 
, 
, 
, 
, 
, 
, 
, 
]. Поэтому больше долей записываются точно.
В древней шумеро-вавилонской практической арифметике деление одного числа на другое выполняется с помощью специальных таблиц. Чтобы найти , древний инженер-информатик берёт «таблицу обратных» и находит число, обратное к B. Обратите внимание, что это не совсем те обратные, не совсем 
 - обратное здесь берётся по основанию системы счисления. Так, в десятеричном примере выше (
), обратное к 
 - это 5. Почему? Потому что 
, то есть 
 при умножении на 5 дают единицу. 
Если принять плавающую точку, то 1 в нулевом разряде, если сдвинуть точку вправо, даст  и т.д. Поэтому, в десятеричном примере, определив обратное 5, нужно посмотреть в таблицу умножения, найти там 
, выписать ответ и не забыть сдвинуть десятичную точку: 
. Так что именно плавающая точка позволяет нормировать имеющиеся числа, приводя их к удобной для вычислений форме записи. Умение работать с такими таблицами очень актуально, ведь в древней Месопотамии нет даже механических арифмометров (ну, скорее всего, их либо нет, либо они слишком дорого стоят). А вот глиняные таблички умножения и взятия обратных для шестидесятеричной системы есть.
Разделим 10,30 на 1,15. Это шумерские цифры. То есть, , а 
. Найдём обратный к 1,15 - это 48, потому что 1,15 * 48 = 1 (то есть, 
). Найдём результат умножения 48 на 10,30. Это 8,24 (а нуля у нас нет - не забывайте). Поставим «плавующую точку» на место и вот результат: 8; 24.
То же самое в клинописных цифрах, как это делал бы инженер-информатик в Месопотамии несколько тысяч лет назад, превращая LaTeX в засечки на глине:
  (здесь черта - знак деления), 
обратный:, умножаем по таблице:
.
Результат: - и через те самые несколько тысяч лет придётся догадываться, где же здесь стоит плавающая точка.
Чуть выше мы нашли, что 1/7 в шумеро-вавилонской системе не представляется точно, потому что запись будет бесконечной: . Так происходит потому, что 7 - взаимно простое с основанием 
. Скорее всего, для древнего шумерского инженера-информатика рациональное число 
 не было бы «рациональным», в том смысле, что такую долю невозможно записать точно в шестидесятеричной системе, а в точных таблицах нет обратного значения. Непонятно, как считать, поэтому 
 не должна встречаться на практике. Конечно, если 
 всё же встретилась, то инженеру-информатику пришлось бы воспользоваться таблицами «приближённых» значений, подобрав подходящий интервал. Такие таблицы тоже имелись, но их наверняка старались избегать, ведь иначе шестидесятеричная система оказывается избыточной.
Литература
- Knuth, D., 1972. Ancient Babylonian Algorithms. Commun. ACM 15 (7) 
- Daniel F. Mansfield, N.J. Wildberger. Plimpton 322 is Babylonian Exact Sexagesimal Trigonometry 
Комментарии (8)
 - ru_vlad04.07.2025 20:42- К сожалению в моем браузере (FireFox) шумерские обозначения не отобразились.  - vened Автор04.07.2025 20:42- Это, скорее всего, из-за неполных шрифтов. Нередкая ситуация, к сожалению - далеко не все блоки Unicode есть в доступных шрифтах. Я поэтому специально обернул все шумерские цифры статьи в LaTeX-выражения, как формулы, чтобы они рендерились отдельно в SVG. Видимо, это не очень-то помогло. 
 
 
           
 

OldCoder
Наверно это ошибка. Должно быть 1/9*9 = 1 ?
 это ошибка. Должно быть 1/9*9 = 1 ?
vened Автор
Имеется в виду, что 0.99999... - это и есть вторая запись 1.