Решение квадратного уравнения (hp-35s)

Поскольку в этом калькуляторе нет автоматического решателя квадратных и кубических уравнений, а то что есть - позволяет решать их только численными методами по одному корню за раз, то я решил немного восполнить этот пробел. Может кому-либо пригодится.

Входные данные - уравнение вида ax2+bx+c=0

Коэффициенты вводятся по запросу калькулятора c нажатием клавиши R/S

Выходные данные - корни (вещественные или комплексные) находятся в двух нижних регистрах стека x2->Y, x1->X

B001	LBL B
B002 	RPN
B003	SF 10
B004	AX2+BX+C=0
B005	PSE
B006	INPUT A
B007	INPUT B
B008	INPUT C
B009 	RCL B        // дискриминант
B010	x2
B011	4
B012	RCL A
B013 	*
B014	RCL C
B015 	*
B016	–
B017	STO D
B018	X<0?
B019	GTO B040
B020	RCL B        // вещественные корни 
B021 	+/-
B022 	RCL D
B023	SQRT x
B024	+
B025	2
B026	/
B027	RCL A
B028 	/
B029	RCL B
B030	+/-
B031 	RCL D
B032 	SQRT x
B033	 –
B034	 2
B035	 /
B036 	RCL A
B037	/
B038	STOP
B039	GTO B001
B040	+/-          // комплексные корни
B041	2
B042	/
B043	RCL A
B044	/
B045	STO X
B046	RCL D
B047	+/-
B048	SQRT x
B049	2
B050	/
B051	RCL A
B052	/
B053	i
B054	*
B055	STO Y
B056	+
B057	RCL X
B058	RCL Y
B059	–
B060	STOP
B061	GTO B001

Символы отличные от изображённых на клавиатуре калькулятора
/ - деление
* - умножение
SQRT x - квадратный корень

Ну и оптимизированный вариант этой-же программы, созданный под влиянием бесед в теме о КВУР:

B001	LBL B
B002	RPN
B003	SF 10
B004	AX^2+BX+C=0
B005	PSE
B006	INPUT A
B007	INPUT B
B008	INPUT C

B009	RCL B           // расчёт -b/(2a)->e
B010	RCL A
B011	/
B012	2
B013	/
B014	+/-
B015	STO E

B016	x2             // расчёт D/4
B017	RCL C
B018	RCL A
B019	/
B020	–

B021	x<0?
B022	GTO B025
B023	SQRT x        // извлечение вещественного корня из D/4
B024	GTO B029
B025	+/-           // извлечение мнимого корня из D/4
B026	SQRT x
B027	i
B028	*

B029	STO D         // вычисление 1-го корня уравнения
B030	RCL E
B031	+
B032	RCL E         // вычисление 2-го корня уравнения
B033	RCL D
B034	–
B035	STOP
B036	GTO B001

Благодаря способности калькулятора работать с комплексными числами окончательное вычисление корней происходит в одном и том же участке кода.
При желании, слегка урезав функциональность можно ещё сократить длину этой программы, а именно можно удалить 2 (если вcегда стартовать из RPN), 3, 4, 5 команды (чтобы удалить сообщение, напоминающее, что программа решает), а команды 35 и 36 можно заменить одной RTN (чтобы программа не возвращалась на начало, а завершалась), тем самым сократив программу до 31 команды. Но мне так нравится больше.

Метки публикаций: 
Undefined

Комментарии

Попробовал вводить программу на своем HP35s, должен сказать, что по сравнению с МК61/52 преимущества программирования на самом устройстве значительны (сдвиги меток, вставка и удаление команд и т.д.). Контрольная сумма - сколько часов она бы сэкономила при вводе длинных программ на МК...

С другой стороны, конечно, не зная принципов работы с МКхх невозможно было бы работать с HP35s без предварительного изучения толстого руководства.