КВУР - квадратное уранение (34, 61, HP35s). Сколько места занимает программа?
В связи с недавней публикацией программ решения квадратных и кубических уравнений, открыл я школьную тетрадочку и обнаружил в ней две свои программы для МК61/52 (должны пойти и на более ранних моделях). Программы оказались короткими.
Уравнение вида: ax2 + bx + c = 0
КВУР МК-61/52 (с использованием регистров)
00.П0 01.: 02.2 03.: 04./-/ 05.П1 06.Fx^2 07.<-> 08.ИП0 09.:
10.- 11.Fx<0 12.18 13./-/ 14.F√ 15.ИП1 16.ВП 17., 18.F√ 19.ИП1
20.<-> 21.- 22.ИП1 23.FВx 24.+ 25.С/П
Вводим c B↑ b B↑ a В/0 С/П
После останова на индикаторе x1, нажимаем <->
- x2. Если корни комплексные вида a±ib, то вместо останова ЕГГОГ, нажимаем <->
- на индикаторе b, еще раз нажимаем <->
- на индикторе a.
КВУР МК-61/52 (без использования регистров)
00.<-> 01.FВx 02.: 03.2 04.: 05./-/ 06.В^ 07.Fx^2 08.FѺ 09.FѺ
10.: 11.- 12.Fx<0 13.17 14./-/ 15.F√ 16.К- 17.F√ 18.- 19.В^
20.FВx 21.2 22.x 23.+ 24.С/П
Инструкция та же самая.
Предположительно, программа с аналогичным функционалом и сервисом должна занимать на HP35s не больше места. А листинг на UserRPL или TI/CASIO-бейсике не должен превышать 25 строк (1 оператор на строку).
Предлагаю проверить предположение.
Дополнение от 01.11.2014. Программа для HP 35s без использования регистров.
A001 LBL A
A002 RPN
A003 CF 10 // ввод FLAGS 2 .0
A004 REGY÷-2÷REGZ // ввод EQN R↓Y : +/- 2 : R↓Z
A005 SQ(REGX)-REGY÷REGT // ввод EQN x2 R↓X курсор вправо - R↓Y : R↓T
A006 x≥0
A007 GTO A010
A008 REGY+ixSQRT(-REGX)
A009 RTN
A010 REGY+SQRT(REGX)
A011 REGZ–SQRT(REGY)
A012 RTN
Ввод: a ENTER b ENTER c XEQ A ENTER
Если корни действительные, то они выводятся на первой и второй строках индикатора. Если корни комплексные вида a ± ib
, то в первой строчке выводится ai*b
.
Длина программы для HP 35s - 114 байт. Это больше, чем размер программы для МК61 за счет использования выражений, хотя построчная запись короче.
Прямой покомандный перевод программы невозможен, так как, например, функция LASTx соответствует FBx не полностью: при стековых операциях перемещений из RX туда ничего не записывается. Требуется добавить несколько команд.
Сравним размер программ на HP35s
Дополнение от 02.11.2014.
Программа для HP 35s с использованием мнемоники комплексных чисел (предложена Vlad_AB, с небольшими изменениями).
С001 LBL С
С002 RPN
С003 CF 10
С004 (-REGY-(SQ(REGY)-4i0xREGZxREGX)^0.5)÷2÷REGZ
С005 (-REGZ+(SQ(REGZ)-4i0xREGTxREGY)^0.5)÷2÷REGT
С006 RTN
Длина 104 байта.
Ввод: a ENTER b ENTER c XEQ C ENTER
Вывод: корни в двух строках дисплея вида a ± ib
. Если Корни действительные, то b = 0.
Несмотря на компактную запись, программа занимает 104 байта. Возможно, виной этому алгебраические выражения? В этом случае программа без использования таковых должна занимать меньше места.
Вариант программы для HP 35s без использования регистров и выражений выглядит менее компактным, но каждому шагу соответствует одна команда.
B001 LBL B
B002 RPN
B003 x<->y
B004 R↓
B005 x<->y
B006 :
B007 LAST x
B008 R↑
B009 x<->y
B010 :
B011 2
B012 :
B013 +/-
B014 x2
B015 LAST x
B016 R↓
B017 x<->y
B018 -
B019 x<->y
B020 R↓
B021 x>=0?
B022 GTO B025
B023 +/-
B024 √x
B025 RTN
B026 √x
B027 -
B028 ENTER
B029 ENTER
B030 LAST x
B031 2
B032 x
B033 +
B034 RTN
Ввод: a ENTER b ENTER c XEQ B ENTER
Если корни действительные, то они выводятся на первой и второй строках индикатора. Если корни комплексные вида a ± ib
, то в первой строчке выводится a, во второй мнимая часть b.
При этом длина программы по прежнему составляет 104 байта!
Полностью очищаем калькулятор (CLEAR, ALL) и вводим простейшую программу.
A001 LBL A
A002 RPN
A003 RET
Информация о состоянии показывает длину программы в 9 байт.
Ну что же, внутреннее представление команд языка HP 35s использует один и более байтов для записи каждой из них. Для условных и безусловных переходов это понятно, нужны 3 байта минимум, а вот для простых команд вроде x2?
Добавим эту команду в программу:
A001 LBL A
A002 RPN
A003 x2
A004 RET
Информация о состоянии показывает длину программы уже в 12 байт. Команда возведения в квадрат занимает 3 байта!
По сравнению с аскетичной записью команд МК61 подобный подход может выглядеть как расточительство памяти. Однако вспомним, что общее число операций в МКхх ограничивалось 255 командами и адресацией 15 регистров памяти, тогда как HP 35s позволяет использовать 800 регистров, 40 физических констант и сотни функций. Для кодирования такого набора требуется не менее 2 байт на каждую команду.
С другой стороны, HP 35s является модернизированной версией старой модели HР 35, требования к объёму занимаемой программой памяти не являются приоритетными, поэтому даже единообразное кодирование "по 3 байта на команду" могло быть простым и надежным решением.
blog comments powered by Disqus