You are here
КВУР - квадратное уранение (34, 61, HP35s). Сколько места занимает программа?
В связи с недавней публикацией ув.basvic программ решения квадратных и кубических уравнений, открыл я школьную тетрадочку и обнаружил в ней две свои программы для МК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 байта на команду" могло быть простым и надежным решением.
Comments
Конечно,
В своё время я под Б3-34 тоже писал решалку квадратных уравнений аналогичную первой, приведенной Вами. Разница в том, что я использовал регистры A,B,C,D а не 0,1,2,3...
Конечно, сократить для HP-35s можно.
А что у Вас за команда во второй программке по адресу 16?
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Команда
Команда по адресу 16.27 - это 16.К-, чтобы ошибку сгенерировать. Я скопировал из эмулятора (он выводит код почему-то) и не исправил.
Следует
Следует заметить, что на CASIO fx-9750G (в 7400G такого решателя нет, но и 5800Р и 991ES решатель есть), TI-89T, HP-50G есть решатель этих уравнений из коробки, поэтому для многих современных ПМК эта задача не актуальна.
на TI-89 например:
cSolve(x^2-4*x+13=0,x)
cSolve(x^3-8*x^2+25*x-26=0,x)
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Проверил я обе
Проверил я обе Ваши программы на железном МК-52 и на двух уравнениях:
x2-4x+3=0 (1, 3)
x2-4x+13=0 (2+3i, 2-3i)
В обоих случаях вещественные корни берёт правильно, а комплексные - нет
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Ответ сошелся
Ответ сошелся, я прогнал второе уравнение (только первую программу с регистрами):
13 B↑ 4 /-/ B↑ 1 B↑ В/0 С/П
получаем ЕГГОГ, нажимем <->, "3", еще раз <->, получаем "2"
Ответ: 2 ± i3
Другой пример 2x2 + 4x + 7 = 0 тоже выдает правильный ответ
-1 ± i1,5811388
В аналитическом виде: -1 ± i√10/2
Попробую на
Попробую на другом экземпляре калькулятора. Может у первого с микропрограммами не всё в порядке.
Попробовал. Сошлось.
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Сергей, на меня
Сергей, на меня можно было и не ссылаться, а комментарии удалил из-за дублирования информации с одной датой.
P.S. Вероятно, на HP-15C можно сделать более короткий вариант. Проверять эту идею мне уже некогда (аврал).
<Этот комментарий тоже можно удалить>
Ну, зачем же
Ну, зачем же удалять. Лет через несколько приятно будет почитать и вспомнить :)
Запись идет под тегом "Конкурс", так что всех авторов надо указывать.
Ну раз это конкурс
Ну если конкурс, то я от себя предложу чуть более короткий вариант:
Длина 95 байт, правда вывод результатов на мой взгляд более удобный. Всегда в регистре X стека один корень а в регистре Y стека второй корень уравнения.
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Ещё одна более
Ещё одна более короткая версия программки:
(LN=64)
ВАХ !!!
ВАХ !!! :-0
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Можно ещё
Можно ещё немного подсократить:
(LN=61)
Теперь
Теперь напрашивается вывод, что если RPN появилась в ПМК с целью уменьшить требования к памяти калькулятора (отсутствие скобок сокращает число команд), то в наше время она этого не обеспечивает, по меньшей мере в ПМК ХП. Оно понятно, что для алгебраической записи нужен парсер, а польская позволяет обойтись без него, что в прошлом существенно удешевляло разработку ПЗУ для ОС ПМК, но в наше время это не так чтобы актуально. Не так ли?
Мои программируемые калькуляторы:
Б3-21, Б3-34, МК-61, МК-52, МК-85
CASIO: cfx-9850GB+, fx-9750G+, fx-9750GII, fx-9860G, Algebra fx-2.0, fx-5800P, fx-7400G+
HP: 50G, 48G, 35s
TI: Nspire-CAS, Voyage-200, 89Titanium
SHARP EL-9600G
Не только в ПМК
Не только в ПМК, обратная польская запись упрощает создание анализаторов грамматик, сводя основную работу к лексическому разбору. Яркий пример - язык Лисп, реализованный еще в начале 1960-х годов (недавно я как раз написал рецензию на одну старую книгу по этой теме).
Требования
[quote=basvic]Теперь напрашивается вывод, что если RPN появилась в ПМК с целью уменьшить требования к памяти калькулятора (отсутствие скобок сокращает число команд), то ... [/quote]
Уменьшение требований к памяти калькулятора зависит от используемой для расчёта формулы, способа (порядка) вычислений данных в стеке, функций доступных «из коробки» и др. Например, расчёт корней квадратного уравнения по той же формуле на «чистом» RPN (без уравнений) может выглядеть так (перед запуском программы коэффициенты сбрасываются в стек в обратном порядке):
(LN=75)
Вероятно, её можно немного подсократить.
Язык RPL имеет в своём арсенале больше команд манипуляции стеком, чем обычный RPN. Аналогичная программа для HP 50g выглядит так:
(размер 58 байт).
[quote=basvic]... в наше время она этого не обеспечивает, по меньшей мере в ПМК ХП. ... [/quote]
Обеспеченность зависит от того, какой калькулятор HP используется, и насколько эффективно реализован процесс вычислений в программе.
P.S. Уравнения в HP-35s - это в большей степени способ более наглядного представления кода, а не уменьшения размера программы (в байтах, не по количеству строк).