Числа, у которых вместо знака стоит цифра

Рассматривается работа с числами, у которых вместо знака стоит цифра. В дальнейшем будем её называть знакоцифра. Автору известны только способы получения чисел, где знакоцифра получается из диапазона 2…9. Более того, есть основание думать, что кроме них допустимы только ещё только две цифры: A = минус, представляет отрицательные числа, и 1, которая отображается как пустое место и представляет положительные числа. Для ПМК БЗ-34 было возможно отображение и других цифр, но в МК-61 это не работает.

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


Способы получения

  1. Хвосты 0C-оборотней. В этом случае используются знания Еггогологии. 0С-оборотни – это числа в диапазоне ±1.|+400…±9.9999999|+499. Для получения таких чисел (точнее хвостов) воспользуемся программой:

     # |  00 01 02 03 04 05 06 07 08 09
     00 |  КНОП 5 0 F10x Fx2 Fx2 Fx2 × x→П9 П→x9
     10 |  П→xc ВП 7 С/П

    На вход ей передаётся число (0…8.9999999], на выходе получаем хвост оборотня из регистра Rc. Поэтому их и называют 0C-оборотни, что сами они на экран дают ноль, а хвост сбрасывают в регистр Rc. Передавать на вход девятку неинтересно, т. к. на выходе получим 10, точнее цифру А, т. е. обычный минус.
    Пример, передав 1, получим 2E. , передав 6, получим 7E. , и т. д. Нажав /-/ получим другую знакоцифру (вычислить какую именно легко, т. к. сумма таких парных знакоцифр = 11). Кстати, если мантисса нулевая, то после /-/ будет −0 для любой знакоцифры.

    Этот способ получения знакоцифры не очень удобен, тем более, что для получения других цифр мантиссы нужно сильно напрячься, например многократно прокрутив счётчик косвенной адресации. Есть способ лучше.

  2. Использование косвенной адресации регистров R4…R6. О том, что при использовании шестнадцатеричных чисел в косвенной адресации для R4…R6 идёт их нормализация уже было упомянуто в мантисса содержит шестнадцатеричные цифры.

    Так вот, если первая цифра 8-значного числа тоже шестнадцатеричная, то перенос из старшего разряда происходит в знаковый разряд, т. е. появляется знакоцифра.

    Для начала возьмём обычную цифру E (для краткости нестандартным способом), которая потом пригодится: 1КВПx→Пe. Затем сделаем её первой (число 8-значным): ВП7x→П4. Получили E0000000. . Если теперь использовать косвенное увеличение: КП→x4П→x4, то получим 240000001. . Тут из цифры E сделан перенос единицы в знаковый разряд. В отличии от 0С-оборотней мы пока получили только знакоцифру два (или 9, если нажать /-/), зато остальные цифры мантиссы легко выбрать нужные (кроме шестнадцатеричных, которые косвенной адресацией нормализуются), а с помощью Восстановление X2 с сохранением первой цифры числа в X можно и первую цифру сделать шестнадцатеричной. Введём простую программу:

     # |  00 01 02 03 04 05 06 07 08 09
     00 |  ←→ КНОП ВП С/П

    Эта программа меняет у числа в X первую цифру на первую цифру из числа в Y. Соответственно, возьмём цифру E и наше новое число со знакоцифрой два и объединим их: П→xeП→x4В/ОС/П. Получили 2E0000001. . Если такое число провести через косвенную адресацию: x→П4КП→x4П→x4, то получим 340000002. . Таким же образом можно получить остальные знакоцифры (до 9 включительно). Кому эстетически не нравится хвостик (в данном случае 2), его можно сбросить до нуля, уже через косвенную адресацию с использованием R0…R3.

Тут стоит сделать отступление и сказать, что в принципе на месте знака можно сделать и шестнадцатеричный символ, но это будет только видимость. Т. е. просто индикатор будет отображать нестандартное число, но как числом им невозможно пользоваться (сохранить, восстановить и т. п.).

Для этого можно использовать знания Еггогологии, где Длинные монстры (±1.|+700…±9.9999999|+799) смещают разряды знака, а C-ЕГГ0Г-оборотни (±1.|+600…±9.9999999|+699) вытаскивают вместо себя содержимое регистра Rc. Для начала введем программу, которая создаст оба монстра и сохранит их в регистры Rd и Rb.

 # |  00 01 02 03 04 05 06 07 08 09
 00 |  Cx 1 4 x→П0 9 5 ПП 12 8 5
 10 |  КПП0 С/П F10x Fx2 Fx2 Fx2 Кx→П0 Cx В/О

После выполнения содержимое регистров будет следующее:

Регистр Значение
Rb 1. 680
Rd 1. 760

Если теперь в регистре Rc сохранить какое-либо число, с нестандартным порядком, то можно заставить этих монстров прикрыть себя изменённым значением Rc.

Операция Индикатор Пояснение
33304 33304.
КИНВ 8.CC L
К{x} C.C L -01
ВП C.C L 00
2 C.C L 02
F10x -5.6974148 СГ Пример числа с нестандартным порядком. Даже отрицательное (шестнадцатеричная арифметика).
x→Пc -5.6974148 СГ Важно сохранить именно в Rc!
П→xd 00.10000000 6 Так выглядит Длинный монстр, с нулём на месте знака (последняя цифра порядка).
П→xc Г.С 00 00 77 Реакция монстра – перевод ПМК в режим ПРГ.
FАВТ 00.10000000 6
П→xb 0. Содержимое R1, которое является косвенным значением для Rb. Кстати, Rb тоже меняется в соответствии с правилами косвенной адресации на 0.0000001|+687.
П→xb 6.8 00 00 69 Реакция этого монстра на попытку его вытащить аналогична предыдущему.
FАВТ СГ.9569741480

Получившееся число фактически является тем же C-ЕГГ0Г-оборотнем, который прикрылся содержимым Rс, перетащив порядок числа в начало, затем цифра знака − 1 (=9), затем сами цифры мантиссы (кроме последней), наезжая на знак порядка. А две цифры порядка (80) – две последние цифры порядка самого монстра. Понятно, что ничего с этим числом сделать нельзя, т. к. это только видимость монстра из Rb. Не забудьте его уничтожить двойным Cx.


Какой знак у числа?

Первый вопрос, который приходит на ум, глядя на такие числа, а они положительные или отрицательные? В дальнейшем для обозначения будем использовать 2N, 3N,…, 9N, где знакоцифра указана явно, а мантисса (может + порядок) обозначена буквой N.

2N 3N 4N 5N 6N 7N 8N 9N
Fx<0 НетНетНетДаДаДаДаДа
Fx≥0 ДаДаДаДаДаНетНетНет

Как видно, далеко не всё так прозрачно. 5N и 6N получаются и отрицательные и положительные. Сравнения с нулём, кстати, для всех проходят корректно (не ноль, если N не ноль).
Рассмотрим другие функции, для косвенного определения знака числа.


Арифметика с этими числами

Нужно понимать, что по модулю функции считают правильно, обычно только знак результата бывает не очевиден. Часть функций уже была рассмотрена выше, где мы пытались определить знак числа. Рассмотрим другие:

Тут нужно остановиться на нуле. Как указано в функции К{x}, может получиться ноль со знакоцифрой. Так вот, он ведёт себя как обычный ноль. Единственное отличие – это в функциях сравнения. Такой ноль ведёт себя так, как указано ранее для чисел со знакоцифрой. В частности число 50. операторы Fx<0, Fx≥0, Fx=0 пропустят, как удовлетворяющее условию.


Произвольная мантисса и выводы

Как видно, почти все операции уничтожают знакоцифру. Гарантированная доступная возможность менять мантиссу без изменения знакоцифры – это использовать косвенную адресацию. И конечно мантиссу можно заранее подготовить. Пример (использую программу и цифру E, полученную выше):

П→xe99999998В/ОС/П Получили E9999998. . Затем x→П4КП→x49П→x4В/ОС/П. Получим 299999999. (Кстати, если нажать /-/, то получим девять девяток). Теперь снова сделаем над ним операцию x→П4КП→x4П→x4. Мы увидим довольно симпатичный ненормализованный ноль 300000000. , которому можно поставить любую первую цифру (но не знакоцифру), как сделано только что по программе. Кстати, если так сделать с девятью девятками, то получится -00000000. .

Фактически, таким образом можно получать почти любые мантиссы (кроме шестнадцатеричных) с нужной знакоцифрой.

Например, хотим получить 321, где 3 – знакоцифра. Используя короткую программу, указанную в начале раздела, у числа 10000019. , заменим первую цифру на E, получим E0000019. . После косвенного увеличения станет 240000020. . Снова заменим на E, получим 2E0000020. . Повторное косвенное увеличение приведёт к 340000021. . Теперь, после замены первой цифры на ноль, останется 321. .

Ещё пример. Хочу получить π/2 (для работы с тригонометрическими функциями), и знакоцифру девять. π/2 = 1.5707963. Начнем с 15707962. , заменим первую цифру на E, получим E5707962. . После косвенного увеличения станет 245707963. . Нажмём /-/, получим 945707963. и сделаем замену первой цифра на 1: 915707963. . Осталось только ВП7/-/x→П1, и мы получили, что хотели 91.5707963 . Можно проверить тригонометрические функции на нем, например синус о него даёт −1.

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

  1. Ставим первой шестнадцатеричную цифру (E из Re) по мини-программе.
  2. Если все цифры мантиссы уже шестнадцатеричные, то завершаем.
  3. Уменьшаем с помощью ВП1/-/ порядок на единицу.
  4. У полученного значения через косвенную адресацию в R7…Rd убираем дробную часть. При этом вместо первой цифры будет вписано знакоцифра − 1, а наша шестнадцатеричная цифра отодвинется. Переходим на п. 1.

По такому алгоритму и цифре E легко получается 2EEEEEEEE. .

Понятно, что в пункте 1 алгоритма можно вписать любую цифру (кроме E). И начать с числа с любой знакоцифрой. Таким образом можно получить практически любую мантиссу с любой знакоцифрой (кроме цифр F или ведущих нулей).

Более того, такие знакоцифры влияют и на остальное. Возьмём, для примера, Восстановление X2 с отбрасыванием первой цифры . На самом деле указанная там последовательность при восстановлении вместо первой цифры записывает знакоцифру − 1, что для положительного числа равно нулю, т. е. отбрасывание цифры. А вот если знакоцифра есть, то эта последовательность запишет её минус один вместо первого знака. Отсюда же понятно, почему для отрицательных запишет 9, это знак минус, как цифра A (= 10) минус один. Причём знакоцифра останется на месте.

На практике автор не использовал такие числа просто в силу того, что в момент активного использования ПМК не обладал этими знаниями. И хотя нестандартность поведения многих функций с такими числами определяется только реакцией на знак числа, всё равно можно предположить, что и это можно использовать для оптимизации.