原发表于:http://lithcore.cn/?p=1246
HP-12C,自1981年生产至今,是HP voyager系列最容易买到的一款机器。这款机器是一个纯金融计算器,缺少许多基本的数学机能,所以即便很好看,也没有办法拿来日常使用(失望)
但是这款机器配备了HP祖传的RPN-Keystroke编程功能,虽然被削弱到HP只能称其为“宏”,但是仍然足以实现如三角函数这类常用数学功能。
本文将一步一步讲解如何实现三角函数,并在这个过程中说说RPN-Keystroke这个非常实用的机上编程方式。
RPN-Keystroke顾名思义,就是“在RPN的基础上通过记录按键顺序实现编程”,至少在最早的可编程手持计算器–生产与1974年的HP-65上是这样的,而在后期的机型上加入了更多的功能,使得其实用性大大增强。
RPN因为操作符后置,使得整个编程过程非常简单易懂,基本上可以说会使用RPN就会用RPN-Keystroke。相比之下隔壁操作符中置的DAL(ALG)要实现编程就会麻烦不少(需要有更多的STO和RCL,而不能像RPN那样随心所欲地操作堆栈)
那么RPN Keystroke有什么用呢?我个人的观点是这种机上编程方式能够快速灵活地为机器增加自己需要的功能,或者重新实现原有的功能以满足自己的需要。因为部分机器支持将某个标号绑定到指定按键上,以RPN Keystroke实现的程序可以像机器原本就有的功能那样调用(这个一直延续到了RPL机型,爱死User菜单了!)
举个例子,我需要解一大堆二次方程,理想情况下在RPN Keystroke下可以写成“输入三个参数,按一下绑定为‘二次函数求解’的按键,显示出结果”,然后继续计算下一个,除去参数总共按键次数只要3次!在不需要考虑A=0和虚数结果的情况下程序实现相当简短。想想最常用的991es+需要按多少次按键才能计算一次。
现在让我们进入正题吧~ HP-12C除了金融计算外的机能非常弱,不过有了RPN Keystroke的帮助,完全足以胜任日常使用了,就让我们从为她添加三角函数的功能开始吧
三角函数计算其实只要计算出一个sin,什么都好说了。因为栈上有了sin的结果后,[Enter] [×] 1 [x<>y] [-] [√x] 栈上就有了sin和cos的结果,然后再按一下÷就出来了tan的结果
那么要怎么计算sin的值呢?最简单的方法就是使用级数展开将sin(rad)变为简单的加减乘除运算,运算4级之后精度基本就够用了(这个方法其实很慢,因为只用计算有限的级数,可以先把其中一些常数计算出来)
$$e^x=\sum\limits_{n=0}^{\infty}\frac{x^n}{n!}=1+x+\frac{x^2}{2!}+\ldots+\frac{x^n}{n!}+\ldots, x\in(-\infty,+\infty)$$
$$\sin x=\sum\limits_{n=0}^\infty(-1)^n\frac{x^{2n+1}}{(2n+1)!}=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\ldots,x\in(-\infty,+\infty)$$
$$\cos x=\sum\limits_{n=0}^\infty(-1)^n\frac{x^{2n}}{(2n)!}=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\ldots,x\in(-\infty,+\infty)$$
$$\ln(1+n)=\sum\limits_{n=1}^\infty(-1)^{n-1}\frac{x^n}{n}=x-\frac{x^2}{2}+\frac{x^3}{3}-\ldots,x\in(-1,1]$$
一些常用的展开,也可以试试把其他两个功能添加到12C里哦~
下面是实现这个运算的程序
001: 1 1 ;-角度-弧度转换部分-
002: 8 8
003: 0 0
004: [×] 20
005: 3 3
006: . 48
007: 1 1
008: 4 4
009: 1 1
010: 5 5
011: 9 9
012: 2 2
013: 6 6
014: 5 5
015: [÷] 10
016: [STO] 0 44 0 ;寄存器0保存的是原角度的弧度表示
017: [STO] 2 44 2 ;寄存器2保存的是sin结果
018: 1 1 ;-计算sin-
019: [STO] 1 44 1 ;寄存器1保存的是计数器
020: [RCL] 1 45 1
021: 2 2
022: [×] 20
023: 1 1
024: [+] 40
025: [ENTER] 36
026: [ENTER] 36
027: [RCL] 0 45 0
028: [x<>y] 34
029: [y^x] 21
030: [x<>y] 34
031: [n!] 43 3
032: [÷] 10 ;计算了(x^(2n+1))/(2n+1)!
033: 1 1
034: [CHS] 16
035: [RCL] 1 45 1
036: [y^x] 21 ;计算了(-1)^n
037: [×] 20
038: [STO][+] 2 44 40 2 ;完整地计算了一级,累加到寄存器2中
039: 1 1
040: [STO][+] 1 44 40 1 ;计数器+1
041: 4 4
042: [x<=y] 43 34
043: [GTO]020 43 33 020 ;到4次了吗?没有的话再来一级
044: 1 1 ;-计算cos-
045: [RCL] 2 45 2
046: [ENTER] 36
047: [×] 20
048: [-] 30
049: [√x] 43 21 ;计算了√(1-sin^2)
050: [RCL] 2 45 2
使用方法:角度输入先按[GTO]000,然后[R/S];弧度输入按[GTO]016 [R/S],输出到x栈的结果是sin,按一下[x<>y]出来cos,再按一下[÷]就是tan