Троичная система счисления

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску

Троичная система счисления — позиционная система счисления с основанием 3. Существует в двух вариантах: несимметричная (цифры 0, 1, 2) и симметричная (цифры −1, 0, 1). Симметричная система позволяет изображать отрицательные числа, не используя отдельный знак минуса.

Десятичная система −3 −2 −1 0 1 2 3 4 5 6 7 8 9
Троичная несимметричная −10 −2 −1 0 1 2 10 11 12 20 21 22 100
Троичная симметричная 10 11 1 0 1 11 10 11 111 110 111 101 100

Симметричная троичная система[править | править код]

Симметричная троичная система использовалась в советской ЭВМ Сетунь.

Симметричная троичная система наиболее экономна с точки зрения представления чисел.

Если не использовать значение «неизвестно», троичная логика сводится к обычной двоичной логике.

Представления чисел в троичной системе[править | править код]

Примером представления чисел в троичной системе счисления может служить запись в этой системе целых положительных чисел:

десятичное число…………… 0 , 1 , 2 , 3 , 4 , 5 , 1 0 0, 1, 2, 3, 4, 5, 1\mathbf{0}

троичное число……………… 0 , 1 , 1 1 ¯ , 10 , 11 , 1 1 ¯ 1 ¯ , 101 0, 1, 1\bar1, 10, 11, 1\bar1\bar1, 101

Если в десятичной системе счисления имеется 10 цифр и веса соседних разрядов различаются в 10 раз ( разряд единиц, разряд десятков, разряд сотен), то в троичной системе используются только три цифры и веса соседних разрядов различаются в три раза ( разряд единиц, разряд троек, разряд девяток, …). Цифра 1, написанная первой левее запятой, обозначает единицу; эта же цифра, написанная второй левее запятой, обозначает тройку и т.д. Число 2 изображается цифрой 1 в разряде троек и цифрой 1 ¯ \bar1 (минус единица) в разряде единиц.

Свойства симметричной троичной системы[править | править код]

Благодаря тому что основание 3 нечетно , в троичной системе возможно симметричное относительно нуля расположение цифр: -1, 0, 1, с которым связано два ценных свойства:

  • естественность представления отрицательных чисел
  • и отсутствие проблемы округления.

Представление отрицательных чисел[править | править код]

Наличие положительных и отрицательных цифр позволяет непосредственно представлять как положительные, так и отрицательные числа. При этом нет необходимости в специальном разряде знака и не надо вводить дополнительный (или обратный) код для выполнения арифметических операций с относительными числами. Все действия над числами, представленными в троичной системе счисления с цифрами 0, 1, -1, выполняются естественно с учетом знаков чисел. Знак числа определяется знаком старшей значащей цифры числа: если она положительна, то и число положительно, если отрицательно, то и число отрицательно. Для изменения знака числа надо изменить знаки всех его цифр (т.е. инвертировать его код).

Например

10 1 ¯ = 8 10\bar1 = 8

1 ¯ 01 = 8 \bar101 = -8

Округление[править | править код]

Другим полезным следствием симметричного расположения значений цифр является отсутствие проблемы округления чисел: абсолютная величина части числа, представленной отбрасываемыми младшими цифрами, никогда не превосходит половины абсолютной величины части числа, соответствующей младшей значащей цифре младшего из сохраняемых разрядов. Следовательно, в результате отбрасывания младших цифр числа получается наилучшее при данном количестве оставшихся цифр приближение этого числа, и округление не требуется.

Перевод в другие системы счисления[править | править код]

Всякое число, записанное в троичной системе счисления с цифрами 0, 1, -1, можно представить в виде суммы целых степеней числа 3, причем если в данном разряде троичного изображения числа стоит цифра 1, то соответствующая этому разряду степень числа 3 входит в сумму со знаком «+», если же цифра -1, то со знаком «-», а если цифра 0, то вовсе не входит. Это можно представить формулой

+ K 3 3 3 + K 2 3 2 + K 1 3 1 + K 0 3 0 + K 1 3 1 + K 2 3 2 + K 3 3 3 + \cdots + K_3\cdot3^3 + K_2\cdot3^2+ K_1\cdot3^1+ K_0\cdot3^0+ K_{-1}\cdot3^{-1}+ K_{-2}\cdot3^{-2}+ K_{-3}\cdot3^{-3} + \cdots

, где

+ K 3 3 3 + K 2 3 2 + K 1 3 1 + K 0 3 0 \cdots + K_3\cdot3^3 + K_2\cdot3^2+ K_1\cdot3^1+ K_0\cdot3^0

целая часть числа, а

K 1 3 1 + K 2 3 2 + K 3 3 3 + K_{-1}\cdot3^{-1}+ K_{-2}\cdot3^{-2}+ K_{-3}\cdot3^{-3} + \cdots

дробная часть числа, причем коэффициенты K могут принимать значения 1, 0, -1.

Для того чтобы число, представленное в троичной системе, перевести в десятичную систему, надо цифру каждого разряда данного числа умножить на соответствующую этому разряду степень числа 3 (в десятичном представлении) и полученные произведения сложить.

Девятеричная форма представления команд[править | править код]

Представление команд троичным кодом при программировании и при вводе в машину неудобно и неэкономно, поэтому вне машины применяется девятеричная форма представления команд. Девятеричные цифры 4 ¯ , 3 ¯ , 2 ¯ , 1 ¯ , 0 , 1 , 2 , 3 , 4 \bar4, \bar3, \bar2, \bar1, 0, 1, 2, 3, 4 сопоставляются парам троичных цифр:

1 ¯ 1 ¯ = 4 ¯ ; 1 ¯ 0 = 3 ¯ ; 1 ¯ 1 = 2 ¯ ; 0 1 ¯ = 1 ¯ ; 0 0 = 0 \bar1\bar1 = \bar4;\quad\bar10 = \bar3;\quad\bar11 = \bar2;\quad0\bar1 = \bar1;\quad\mathbf{0}\mathbf{0} = \mathbf{0} ;

1 1 = 4 ; 1 0 = 3 ; 01 1 ¯ = 2 ; 0 1 = 1 . \mathbf{1}\mathbf{1} = \mathbf{4};\quad\mathbf{1}\mathbf{0} = \mathbf{3};\quad01\bar1 = 2;\quad\mathbf{0}\mathbf{1} = \mathbf{1}.

При выводе из машины отрицательные девятеричные цифры обозначают буквами:

девятеричная цифра 1 ¯ \bar1 2 ¯ \bar2 3 ¯ \bar3 4 ¯ \bar4
буква латинского алфавита Z Y X W
буква русского алфавита Ц У Х Ж

Исключающее ИЛИ[править | править код]

Вычисляется min(max(x, y), −min(x, y)):

 ⊕ | -1  0 +1
---+----------
-1 | -1  0 +1
 0 |  0  0  0
+1 | +1  0 -1

Перевод числа в троичную систему счисления[править | править код]

Реализация перевода числа в троичную симметричную (задача «ВСимметричную»), несимметричную (задача «ВНесимметричную)» систему счисления и обратно (задача «ВЧисло») на языке Глагол (для вывода числа в симметричной системе счисления используются знаки «-», «0», «+»):

 ПЕР 
   память: ДОСТУП К НАБОР ячейки: РЯД 20 ИЗ ЦЕЛ; размер: УЗКЦЕЛ; отрицательное: КЛЮЧ КОН; 
 
 ЗАДАЧА СоздатьПамять; 
 УКАЗ 
   СОЗДАТЬ(память); 
   память.размер := 0; 
   память.отрицательное := ОТКЛ 
 КОН СоздатьПамять; 
 
 ЗАДАЧА ДобавитьВПамять(что: ЦЕЛ); 
 УКАЗ 
   память.ячейки[память.размер] := что; 
   УВЕЛИЧИТЬ(память.размер) 
 КОН ДобавитьВПамять; 
 
 ЗАДАЧА ОбратитьПамять; 
 ПЕР 
   зчсл: ЦЕЛ; 
   сч: ЦЕЛ; 
 УКАЗ 
   ОТ сч := 0 ДО память.размер ДЕЛИТЬ 2 - 1 ВЫП 
     зчсл := память.ячейки[сч]; 
     память.ячейки[сч] := память.ячейки[память.размер-сч-1]; 
     память.ячейки[память.размер-сч-1] := зчсл 
   КОН 
 КОН ОбратитьПамять; 
 
 ЗАДАЧА ВывестиПамять(симметричная: КЛЮЧ); 
 ПЕР 
   сч: ЦЕЛ; 
 УКАЗ 
   ЕСЛИ НЕ симметричная И память.отрицательное ТО Вывод.Цепь("-") КОН; 
   ОТ сч := 0 ДО память.размер-1 ВЫП 
     ЕСЛИ симметричная ТО 
       ЕСЛИ память.ячейки[сч] < 0 ТО Вывод.Цепь("-")
       АЕСЛИ память.ячейки[сч] > 0 ТО Вывод.Цепь("+")
       ИНАЧЕ Вывод.Цепь("0") КОН 
     ИНАЧЕ 
       Вывод.ЧЦел("%d", память.ячейки[сч], 0, 0, 0) 
     КОН 
   КОН 
 КОН ВывестиПамять; 
 
 ЗАДАЧА УдалитьПамять; 
 УКАЗ 
   память := ПУСТО 
 КОН УдалитьПамять; 
 
 ЗАДАЧА ВНесимметричную(число: ЦЕЛ); 
 УКАЗ 
   ЕСЛИ число < 0 ТО память.отрицательное := ВКЛ КОН; 
   число := МОДУЛЬ(число); 
   ПОКА число >= 3 ВЫП 
     ДобавитьВПамять(число ОСТАТОК 3); 
     число := число ДЕЛИТЬ 3 
   КОН; 
   ДобавитьВПамять(число); 
   ОбратитьПамять; 
   ВывестиПамять(ОТКЛ); 
 КОН ВНесимметричную; 
 
 ЗАДАЧА ВСимметричную(число: ЦЕЛ); 
 ПЕР 
   о: ЦЕЛ; 
   з: КЛЮЧ; 
   ЗАДАЧА ВПамять(что: ЦЕЛ); 
   УКАЗ 
     ЕСЛИ память.отрицательное ТО 
       ЕСЛИ что < 0 ТО ДобавитьВПамять(1)
       АЕСЛИ что > 0 ТО ДобавитьВПамять(-1)
       ИНАЧЕ ДобавитьВПамять(0) КОН 
     ИНАЧЕ 
       ДобавитьВПамять(что) 
     КОН 
   КОН ВПамять; 
 УКАЗ 
   ЕСЛИ число < 0 ТО память.отрицательное := ВКЛ КОН; 
   число := МОДУЛЬ(число); 
   з := ОТКЛ; 
   ПОКА число > 0 ВЫП 
     о := число ОСТАТОК 3; 
     число := число ДЕЛИТЬ 3; 
     ЕСЛИ з ТО 
       ЕСЛИ о = 2 ТО ВПамять(0) АЕСЛИ о = 1 ТО ВПамять(-1) ИНАЧЕ ВПамять(1); з := ОТКЛ КОН 
     ИНАЧЕ 
       ЕСЛИ о = 2 ТО ВПамять(-1); з := ВКЛ ИНАЧЕ ВПамять(о) КОН 
     КОН 
   КОН; 
   ЕСЛИ з ТО ВПамять(1) КОН; 
   ОбратитьПамять; 
   ВывестиПамять(ВКЛ); 
 КОН ВСимметричную; 
 
 ЗАДАЧА ВЧисло(): ЦЕЛ; 
 ПЕР 
   сч, мн: ЦЕЛ; 
   результат: ЦЕЛ; 
 УКАЗ 
   результат := 0; 
   мн := 1; 
   ОТ сч := 0 ДО память.размер-1 ВЫП 
     УВЕЛИЧИТЬ(результат, память.ячейки[память.размер-сч-1]*мн); 
     мн := мн * 3 
   КОН; 
   ВОЗВРАТ результат 
 КОН ВЧисло; 

См. также[править | править код]

Литература[править | править код]

Брусенцов Н.П., С.П. Маслов, В.П. Розин, А.М. Тишулина "Малая цифровая вычислительная машина Сетунь" Издательство Московского университета 1965