HP 35s

HP 35s (F2215A) は、ヒューレット・パッカードの長い歴史を持つグラフ描画機能のないプログラマブル関数電卓の最新機種である。HP 33sの後継であるにもかかわらず、HP-35の35周年を記念するために販売された。HP-35はヒューレット・パッカードの最初のポケット電卓であり、世界で最初のポケット関数電卓である。HPは黒い光沢のある前面パネルを持ち "Celebrating 35 years" と印刷された限定生産記念モデルも発売した。

特徴
HP 35s は、入力方式として逆ポーランド記法 (RPN) あるいは中置記法（ALG）のどちらも使用できる。

他の特徴として以下の特徴がある。

 2行アルファベット表示可能 LCD
 800超のレジスター（26個は直接ラベル付けされている）
 数学と統計の機能
 10進数、2進数、8進数、16進数で操作可能
 任意の変数の値を求める方程式ソルバー（ で初採用）
 数値積分（HP-34C で初採用）
 分数の入力と表示に対応
 複素数とベクトルの計算
 単位変換と物理定数一覧
 キーストローク式プログラミング。プログラムとデータのために約30KBのメモリが使用可能。

HP 35s は、1970年代から1990年代までの古典的なHP電卓を思い出させるレトロな外観を与えられている。しかしながら、古典的なHP電卓よりも遥かに多い機能、高い処理能力、そして初期のモデルのほとんどよりも多いメモリを有している。

HP 35s の物理的な外観とキー配置は、その直系の前機種である HP 33s と大きく異なっている。しかし、その2つの電卓は機能的に非常に似ている。主な違いは以下の通りである。

 HP 35s は、プログラムの中でラベルと行番号によるアドレス指定の両方を許している。HP 33s はラベルによるアドレス指定だけが可能である。26個のラベルだけで、30KBのメモリ全体を使い切るプログラムを書くことは難しい。
 HP 35s のメモリは、追加の801個の番号付メモリレジスタという形式でデータの格納にも使える。
 ベクトルの操作は、HP 35s で新しく追加されている。
 複素数は2つの分かれた値の代わりに1つの数値として扱われている。
 間接分岐（メモリレジスタの内容が分岐命令 (GTO または XEQ) の飛び先として使われることを可能とする）は、HP 35s から削除された。
 方程式の長さに制限がない（33s は255文字の制限があった）。

HP は Windows OS （そして Wine）のためのフリーウェアの 35s エミュレーターを提供してきた。以前は教室でのデモンストレーション目的の教師にだけ利用可能とされていた。2019年1月現在、HP による直接の配布は行われておらず、Educalc.net や software.informer で配布されている。

構造

HP 35s はヒューレット・パッカードと台湾の の協力によって設計された。Kinpo Electronics は中国本土で HP のために電卓を製造している。

HP によると、この電卓は過酷な状況の業務で使用できるように設計されており、極限環境条件において試験されてきたとのことである 。この電卓は部品をしっかりと固定し、メンテナンスを容易にするために25本のネジで組み立てられている。

この筐体は、革新的だった HP-65 のような1970年代の HP 電卓から多くの設計要素を取り入れたことが特徴である。銀色のスジを持つ曲がった両端、前に傾斜の付いたキー、そしてゴールド（実際には黄色）と青のシフトキーである。フェイスプレートは金属製でプラスチック筐体に接着されている。キーの文字は、古典的なモデルで使われた二色成形ではなく、印刷されている。

この電卓は2つの CR2032 ボタン電池によって動作している。ボタン電池はメモリ消失を避けるために一度に一個ずつ交換するように勧められている。

当初はジッパーで強く閉じることのできるポケット付きのクラムシェルケース（二枚貝のように開くケース）と印刷された説明書が同梱されていた。しかし、後にビニールで覆われた厚紙で作られたジッパーのないケースと PDF の説明書が収められた CD-ROM に変更された。そのケースの両側は伸縮し、裏地はベルベット（ビロード）である。

この電卓は完全に自己完結している。ファームウェアを更新する仕組みがなく、（PCと接続して）プログラムとデータをロードしたりセーブしたりする仕組みもない。

評判
35s の製造品質とインダストリアルデザインは、最良だった HP プロフェッショナル電卓の伝統への回帰として評論家に歓迎された。教育市場向けの機能満載かつ重厚なスタイルのように思えるより新しい進化した電卓とは対照的である。しかし、いくつかの場合においては、貧弱な設計と品質と言える。特筆するべきことは、大きな キーが伝統的な場所に戻ったとともにキーボードの感触が伝統的な HP のものになっていることである。認識されてきた欠点は、（プログラムとデータをロードしたりセーブするための）コンピューターと通信する仕組みが欠落していることと処理速度が遅いことである。

この電卓のロジックに対する反響は様々である。アドレス可能レジスタの増加とプログラムの行番号アドレス指定の導入は、33s を越える大きな改良と見なされてきた。33s と比べて改善された複素数の扱いは歓迎される一方で、複素数の不完全な対応は批判されてきた。16進数とその他の10進数ではないときの動作は、過剰な回数かつ非直感的なキー操作を要求するとして批判されてきた。数点のファームウェアのバグが報告されてもいるが、それらは未だに修正されていない。

35s に通信機能がないおかげで、35s よりも強力な電卓が使用できないいくつかのプロフェッショナルな資格試験で 35s を使用することが許されている。例えば、アメリカ合衆国において、35s は （FE 試験）と （PE試験）で使用を許可された最も強力なプログラム可能電卓である。

機能詳細

入力モード
35s は RPN と中置記法（ALG）入力モードに対応している。デフォルトは RPN である。
入力モードは使用者によって容易に切替できる。ディスプレイは常に現在の入力モードを表示する。

RPN モードにおいて、4レベルスタックを使用する。グラフ電卓を除いた最初期から全ての HP の RPN 電卓が持っているものである（HP のグラフ電卓はレベルの数に制限がないスタックを使う）。通常のコンピューター科学と違って、35s のような RPN 電卓は、スタックの底からデータの出し入れを行い、スタックの最上部をスタックの終端とする。スタックのレベルは X（底）、Y、Z、そして T（最上部）と命名されている。それらは同名の変数との関連はない。レベル X はディスプレイの下の行に表示され、レベル Y は上の行に表示される。各スタックレベルは、電卓が対応している全てのデータ形式を格納することができる。つまり、実数、複素数、あるいはベクトルのことである。様々な機能がスタックを操作するために提供されている。ロール（スタックの回転）を行うための と 、X と Y をスワップ（入替）するための 、そして最後に使用した X の値を呼出すための 、X と名前あり変数をスワップするための のようなものである。

中置記法（ALG）モードは、使用者が数式を入力し、それを電卓に評価させるために を押すことによって動作する。数式はディスプレイの上の行に表示され、計算結果は下の行に表示される。計算後の数式は方向キーとバックスペースキーを使って編集することができる。編集後の式は再評価することができる。

単位と分数

この電卓のレトロなテーマに合わせるために帝国単位/米国慣用単位とメートル法の間の換算は 35s のキーパッド上で目立った特長となっている。伝統的な単位を使っている人々やその他の用途のためにこの電卓は帯分数としての数値入力と帯分数としての数値の表示を可能にしている。

帯分数の入力は、部分毎に分けるために小数点を使う。例えば、 という手順は、 インチを 10.0 cmへ変換する（概算）。

この電卓は キーを押すことによって帯分数を自動的に表示するかどうかを設定する。
最大の分母は を使って指定される。番号付フラグは3種類の分母システムのどれを使うのかを指定する。3種類の分母システムは、最も正確な分母、最大の因数で制限された分母（例えば、最大値が16のとき、2, 4, 8, 16 のどれかが分母になる）、あるいは固定された分母である。ディスプレイ上の2つの小さな矢印の記号は、実際の値が表示されている値よりもわずかに上か下かどうかを示している。表示されている分数の一部を直接抽出する機能はない。

複素数
以前（そして他の現行機種）の HP 電卓は、様々な方法で複素数を扱ってきた。
HP 33s において、複素数は2つの分かれた数値として格納されていた。そして、"complex" 修飾子は、複素数を格納しているとしてスタックを扱う操作を指定するために使われる。例えば、 と を加算するために次のキー操作を必要とする。
 
この操作は4レベルスタックの全てを使い切っている。

35s は単一の数値として複素数を格納する。通常の手段としてそのような操作をすることができる。 と を加算する上の例は、次のように行うことができる。

35s において、複素数を扱える関数の数は制限されており、少々気まぐれである。例えば、負の実数の平方根を直接取ると、複素数の代わりにエラーメッセージが表示される。このことの厳密な定義は、負数ではない実数 a はただ1つの負数ではない平方根を持ち、主平方根と呼ばれ、 で示される。記号 √ は根号あるいは根と呼ばれる。例えば、9の主平方根は3であり、 = 3 と表現される。なぜなら、 であり、3は負数ではない。しかしながら、 キーを使って x を 0.5 乗することは、その数字が0に等しい虚部を伴う実数として入力されるという条件で動作することになる。逆三角関数と双曲線関数は、複素数を使用することができない。e を底とする対数（自然対数）と冪乗は、複素数を使用できる。しかし、10を底とする対数（常用対数）は複素数を使用できない。しかしながら、それらの制約の多くに回避策が存在する。

複素数は、直交形式（ キーを使用）あるいは極形式（ キーを使用）のどちらでも入力できる。そして、複素数がどのように入力されたのかに関わらずどちらの形式でも表示できる。 を使って複素数の半径 r を求め、 を使って複素数の角度 Θ を求めることができる。実部と虚部を抽出するための関数は存在しない。けれども数式 と を使って対処することができる

ベクトル
35s は、3つまでの実数要素を持つベクトルを扱うことができる。
1つのベクトルはスタックあるいはあらゆる変数に1つの値として格納される。そして、様々な関数によって処理される。
ベクトルは角括弧 から始め、ベクトルの要素の値をコンマ によって分離することによって入力される。ベクトルはスカラーによって加算、減算、乗算、除算することができる。同じ次元の2つのベクトルは、加算されたり、減算されたりする。そして、内積を得るために乗算もされる。 関数は、ベクトルの大きさを返す。
外積は利用できない。ベクトルから個々の要素を抽出するための関数も存在しない。しかし、これらはユーザーによって容易に計算することができる。

ベクトルは、3つまでの実数を一緒に格納するという単純な使い方もできる。それによって、電卓のストレージ容量を増大することができる。けれども、より複雑になり、速度も低下する。HP はこれを可能にする 35s のためのプログラムコードを配布してきた。

底の数（n進数の n）
この電卓はデフォルト設定の10進数だけではなく2進数、8進数、16進数形式で値を表示する設定が可能である。
10進数ではない底が選択されたとき、計算結果は整数へ切り縮められる。

どのような底が設定されているかどうかに関わらず、10進数ではない数値は、底を指定する添え字（h, o, b）を付けて入力されなければならないので、3回以上の余計なキー操作を伴う。

16進数が選択されているとき、10進数のときに浮動小数点関数（三角関数、対数関数、指数関数など）のために使われている6つのキーの行は、その代わりとして16進数の数値である A から F に割り当てられる（それらのキーは物理的に から と印刷されているけれど）。

10進数以外の底において、ワードの長さは36ビットに固定される。そして、2の補数の符号反転を使う。
6つのビット演算が利用できる。つまり、 である。

統計と確率
35s の統計機能は、ごく普通である。
1変数統計あるいは2変数統計の集合を処理することができる。
計算された結果は、平均、加重平均、標準偏差、そして線形回帰を含んでいる。
6つの総和レジスタ（n, Σx, Σy, Σx2, Σy2, Σxy）は計算をさらに続けるために利用可能でもある。

乱数だけでなく、確率の関数（組合せと順列）が利用できる。

メモリと変数

35s は 30KB のユーザーメモリを提供する。ユーザーメモリは、データ、格納された方程式、そしてプログラムによって共用される。
複素数と3要素までのベクトルは1つの値として格納することができるので、各変数は37バイトを占有する。型情報と3つの浮動小数点数のためには十分な大きさである。

26個のアルファベットで命名された変数と6つの統計レジスタは、メモリ上に永久に割当てられる。メモリ空間の余りは、間接アクセスしかできない801個までの変数によって占められる可能性がある。あらゆる変数への間接アクセスは、ポインタとして 変数あるいは 変数に連番（0～800）を格納し、 あるいは によって変数にアクセスすることによって実現される。間接変数は自動的にメモリ上に割当てられる。1つの間接変数に0ではない値を格納することは、その間接変数までの連番を持つ全ての変数の割当という結果になる（例えば、間接変数を1つも使っていない状態で100番の間接変数に0ではない値を代入すると、0～100番の間接変数が全て割り当てられてしまう）。逆に最も大きな連番で割り当てられた間接変数に0を格納することは、0ではない値に遭遇するまで連番を下るように間接変数の割当を解除していくという結果になる（例えば、50番と100番の間接変数に0ではない数値が入っており、51番～99番の間接変数は0が入っているとする。その場合、100番の間接変数に0を代入すると、51番から100番の間接変数の割当が解除される）。割当てられていない変数の読出しを試みることは、エラーという結果になる。それゆえに必要な番号よりも大きな番号の変数に0ではない値を格納することが一般的な実践方法である。それよりも小さな番号の全ての変数がその値に関わらず利用可能にされることを保証するためである。永久に割当てられる変数と統計レジスタは、-1 から -32 までの負の連番を使って間接的にアクセスされることもできる。

この電卓は41の数学定数と物理定数を提供する。それらは で表示され、スクロールして選択される。
12個の2値フラグが利用できる。各フラグはこの電卓の動作を決定するためにユーザーによって設定される。それらの中の5つはあらゆる目的のために使われる。

格納された方程式は、各文字毎に1バイトを使用し、1つの方程式に3バイトのオーバーヘッドが必要である。

プログラム1ステップは3バイトを使用する。前述のように値あるいは方程式を指定するステップはさらにメモリを使う。

使用中あるいは利用可能なメモリの量は、ユーザによって容易に確認できる。しかし、プログラムからは確認できない。ユーザーは を使って、指定した番号より上の全ての間接変数をクリアすることができる。

方程式
変数とプログラムだけでなく、ユーザーはこの電卓にいくつもの方程式を格納することが可能である。この文脈における「方程式」は、数式 ( f(x,...) )、等式 ( f1(x,...) = f2(x,...) )、そして代入 ( y = f(x,...) ) を意味する。これらは異なった方法でそれぞれ処理される。方程式は一般的に命名された変数を含んでいる。変数の値は実行中にユーザーによって入力される。しかし、スタックから値をとることもできる。

方程式は RPN 入力モードが有効であるときでさえ中置記法で入力される。方程式は キーでアクセスされるリストに格納され、ユーザーはリストをスクロールしたり、方程式を追加、編集、そして削除することができる。そして、方程式を処理するために1つの方程式を選択する。

方程式は多くの方法で処理される。
 方程式は、 あるいは を使って評価される。ユーザーは方程式に含まれる変数の値を入力するように促される。代入の場合、目標変数が結果を受け取る。
 方程式は、 を使って含まれている変数のどれか1つのために解かれる。他の変数の値をユーザーに入力するように促した後で、要求される変数の値を分離しようと試みるロジックを使う。この処理は時間がかかり、方程式は1つ以上の解を持っているので、2つの「推測値」によって導かれる。2つの推測値は、ユーザーによってスタックの X レジスタと要求される変数の中に入力されていると仮定する。
 方程式は、 を使って積分される。ユーザーは最初にスタックに積分区間の上限と下限を置く、それから方程式と を選択する。 は積分される変数名と他の変数の値を入力するように促す。

方程式リストの中に2つの組込済み機能も存在する。線型方程式系において全ての変数を解くことを可能にする。2変数を持つ2つの方程式と3変数を持つ3つの方程式の系に対応している。

方程式を解いたり、特に積分をすることは、時間とメモリを消費する。表示精度を低下させたり、十分なメモリが利用できることを確実にすることによって、効率は改善される。

方程式の内容は方程式が処理されるまで確認されないので、文章を含むあらゆる文字列を含んでいるかもしれない。このことは方程式リストの中に文字列を含ませるために利用されるかもしれない（このページの最上部の写真で示すように）。

プログラミング
HP 35s は、キーストローク（キー操作）によるプログラムが可能である。ユーザーが解きたい特定の問題を解くためにキー操作の手順を記憶し、後に実行できることを意味している。プログラムのキー操作は完全に併合される。シフトキーあるいはメニューによってアクセスされた機能は、2つ以上ではなく1つのキー操作として記録される（併合）。これらのキー操作は、キーボード上で普通に利用可能なあらゆる操作を実行するだけでなく、条件分岐命令と無条件分岐命令とループ命令を使用できるので、プログラムは反復操作を実行し、決定を行うことが可能である。

全てのプログラムは1つの連続したプログラム空間に格納される。そして、 キーを使ってプログラミングモードへ切替えることによってプログラムの新規作成と編集が行われる。プログラム空間の範囲内で26個までのアルファベットラベルが という形式で定義される。そして、それぞれのラベルに998ステップまで（ラベル自身のステップを除く）のプログラムが続いているので、あらゆるステップは ("go to") あるいは ("execute") 命令によって という形式で飛び先にされる（あるいはラベル自身のステップを飛び先にするために GTO/XEQ 命令の後に だけを押すと、A001になる）。最初のラベルより前のステップは、4桁で番号付けされる。しかし、これらのステップは飛び先にできない。プログラム空間中のステップの後に続く挿入と削除は、飛び先のステップ番号の変更を反映するために GTO/XEQ 命令が自動的に訂正されることになる。分離したプログラムの開始地点を示すためにそれぞれのラベルを使うことが慣習になっているので、あらゆるプログラムは という形式の命令によって実行される。プログラムの実行は、 ("run/stop") キーによって中断したり、再開したりすることができる。そして、プログラムステップポインターは キーと キーを使って移動される。プログラムラベルと同名の変数の間に繋がりはない。

通常操作と同様にプログラミングは RPN あるいは ALG（中置記法）モードのどちらでも実行できる。RPN モードのプログラムは、中置記法よりも小さくて高速である。

以下は、2から69までの整数の階乗を計算するサンプルプログラムである（電卓に搭載済みの階乗とガンマ関数を無視している）。この例には、2つのバージョンが存在する。1つは ALG（中置記法）モード用であり、もう1つは RPN モード用である。RPN バージョンは ALG バージョンよりもかなり短い。

ALG（中置記法）バージョン:
 ステップ 命令 コメント A001 プログラム A の開始 A002 表示されている値を N に格納する A003 F に 1 を格納する A004 N × F を F に格納する A005 N をデクリメントして、それが 0 でなければ・・・ A006 ・・・ステップ A004 へ戻る A007 プログラム終了。結果が表示される。

RPN バージョン:
 ステップ 命令 コメント R001 プログラム R の開始 R002 スタックの X レジスタを変数 N へ格納 R003 スタックレジスタ X に置かれた数値 1 で開始 R004 変数 N を呼出すと、スタックは上に移動し、変数 N の値が X レジスタに置かれる。そして、スタックの底から2つのスタックレジスタを乗算する。 R005 N をデクリメントして、それが 0 でなければ・・・ R006 ・・・ステップ R004 へ戻る R007 プログラム終了。結果はスタックの X レジスタに入っており、表示されている。

単一のプログラムステップとして、方程式がプログラムの中に組み込まれていることがある。
この電卓の設定は、プログラム中の数式が実行中に評価される、あるいは表示されるかを指定する番号付フラグを含んでいる。
方程式はあらゆる文字列を格納することができるので、方程式は表示されるためのメッセージとして作られることがある。
メッセージ表示後、プログラムは を押されるまで停止する、あるいはメッセージに続いて (pause) を押すならば、続行する前に1秒間一時停止する。

プログラムは方程式とほぼ同じ方法で解かれたり積分されたりすることもある。リストから方程式を選択する代わりにユーザーは を押し、プログラムのラベルを押し、 あるいは のどちらかを押すと、目標変数の名前の入力を促す。プログラムが 命令（プログラムが値の入力を促すようにする）を含んでいない限り、目標変数以外の他の変数の値が使われる。方程式を解く場合、プログラムは戻り値（スタックに残る）が 0 でなければならない数式として扱われる。プログラムは他の方程式／プログラムを解いたり積分したりするための命令を含むこともできる。