|
20年前に誕生した傑作電卓ソフトが
フリーソフトになって復活しました。 |
|
(起動画面で表示されるバージョン番号が、V2.11〜V2.12aの場合、最新版をダウンロードしてください。)
(社内業務用にも無料で使用出来ますが、自社サイトのどこかにこのページへのリンクを表示してください。)
|
|
8ビットパソコン時代のCP/M版の27桁(内部演算29桁)超高速高精度10進浮動小数点演算プログラマブル関数電卓ソフト「DENTAC」をMS-DOSに移植したプログラムです。
WindowsでもDOS窓で使用出来ます。PC-9801(PC-9821)シリーズとDOS/V互換機の双方で使用出来ます。
ダウンロード無料(DENTACマニュアルは、FreeViewFastで読めます)
↓
HP互換27桁高速高精度プログラマブル関数電卓ソフト DENTAC V2.12b
(V2.11b→V2.12:$_命令を追加、カーソルキーに機能割り当て)
(V2.12→V2.12a:Tabキーで区切って複数の数値を1行に入力可能)
(論理演算関数ライブラリと分数計算ライブラリが付属しています。)
HP互換27桁高速高精度プログラマブル関数電卓ソフト DENTAC V2.11b
(V2.11a→V2.11b:ラベル数最大128→256、メモリ数初期値128→256に拡大)
オマケ→LOGIC.DTC
LOGIC1.DTC LOGIC2.DTC
LOGIC3.DTC LOGIC4.DTC
(2進/8進/16進入出力・論理演算関数
89bitまで演算可能)
掲示板 DENTAC情報 もご利用ください(是非、ご意見ご感想をお寄せください)
(注意:画面表示でエスケープシーケンスを使用しますから、DENTACを起動してプロンプトの直後に余計な記号が表示される場合、エスケープシーケンスドライバが組み込まれていません。Readme.txtをお読みになってドライバを組み込んでください。)
|
HP社のプログラマブル電卓と同様に逆ポーランド記法(RPN)で操作します。
2足す3は、通常の電卓では、2 + 3 =ですが、DENTACでは、2 3 +
(2に3を足す)です。(2+3)*(4+5)はDENTACでは、2 3+4 5+* (2と3の和と4と5の和を掛ける)です。
括弧無しで複雑な式の計算が出来るので、能率良く計算出来ます。
BASICの対話モードは、電卓代わりに使うには不便ですが、DENTACは、電卓として使うことを基本に強力なプログラム機能を備えていますから、パソコンに装備しておくと超便利に使えます。
数式通りの計算は、簡単そうで手間がかかる!
| BASIC |
pi=3.141592653589793
? sin(30 * pi/180)
0.5 |
角度単位が常に
[ラジアン]なので、[度]から[ラジアン]に換算する必要有り |
| DENTAC |
>SD
>30s
0.500 |
SD:角度単位を
[度]に設定
s :sin |
元々、HP社のプログラマブル電卓の演算精度の高さをお手本に開発したのですが、本家の電卓より遥かに高速(企業秘密の高速10進演算ルーチンを開発)かつ高精度で計算出来ます。
◎演算レンジ±9.99999999999999999999999999E±9999
◎4MHzのZ-80で、有効桁数11桁の場合
乗算が0.7〜2.5ms、sin関数が12〜35ms
◎4MHzのZ-80で、有効桁数27桁の場合は、
乗算が1.0〜7.8ms、sin関数が29〜124ms
(HP-29Cは、有効桁数10桁でsin関数が1.3秒)
普通の電卓では、2 / 3 * 3 = 1.999999998
のように最後の桁で誤差が出ます。
DENTACでは、2 3 / 3 * で 2.0000000000
が表示されます(内部演算を2桁余分に行って四捨五入するので、たいていの場合、最後の桁まで正確)。
さらに、DENTACでは、指数部が2桁の普通の関数電卓では、オーバーフローするので計算不可能な、
1000の階乗 や 2の10000乗が計算出来ます。
圧巻は、1 割る 0 で、エラーにならず、無限大が答えとして表示されます(~記号が無限大を現す)。
プログラム機能も使い易く、2の10000乗が、
1 10000{2*} (1に、10000回、2を掛ける)と簡単に記述出来ます。しかも{ }による繰り返しはプログラムを作成しなくてもコマンドモードで直接入力出来ます!
Windows時代の今、パソコンの演算速度は、CP/M時代の1000倍以上高速化していますから、ソフトウェアで10進浮動小数点演算を実行しても、MS-DOS時代の(高価だった)8087数値演算コプロセッサ並みの計算速度が期待出来ます。
ということは、CPUパワーをGUIばかりに注ぎ込まずに、高精度演算に使うという発想の転換も生まれてよいのではないでしょうか?
(通常のソフトで使われている2進浮動小数点演算の計算誤差の問題はインターネットで、キーワード「計算誤差 2進」を検索すると解説ページがいっぱい見つかりますから、説明を省略します。
とにかく、DENTACでは10進法のまま計算するので、2進浮動小数点で発生する奇怪な誤差に悩まされる心配は有りません。)
(複雑な計算では最終的な計算結果の桁数は10桁で十分な場合でも、計算途中の値は2倍以上の有効桁数が無いと、高精度な計算結果が得られません。DENTACなら余裕を持って計算出来ます。
また複雑な計算では計算途中の値が非常に大きな値になって指数部が2桁ではオーバーフローする場合がありますが、DENTACなら指数部が4桁有るので余裕が有ります。) |
DENTAC開発のお手本になったHP-29C
仮数部10桁、指数部2桁、LED表示
1977年8月17日に購入 |
 |
|
HP-29Cの説明書(日本語版) |
 |
|
DENTAC開発時のこぼれ話
HP社の電卓の開発者は徹底的に計算精度を追求したようで、なんと10の99乗[度]のsinがエラーにならずに計算出来るのにビックリしました。
正常なのか確かめるために、さらにarc sinで元に戻すと、-80[度]になります。
-80[度]=280[度]で、10の99乗[度]を360[度]で割った余りが280[度]になる、というのを最初に計算していると推測出来ました。
が、有効桁10桁で割り算をしたら、そんな答えは計算出来ないわけです。どうしたらよいのかしばらく悩みましたが、剰余専門の除算ルーチンを作って、(桁数が大きくなる)商は求めず余りだけ求めれば計算可能なことに気付きました。
というわけで、DENTACには剰余命令(\記号を使用)が付いていて、
1E99 360\ (10の99乗を360で割った余り)で、答えとして、280 がちゃんと表示されます。
補足1:
剰余は、BASIC(VB) では mod で、C言語では、% で現します。DENTACでは % は正直に %計算に使用するので
\記号を割り当てています。
補足2:
BASIC(VB)では、剰余は、整数演算でしか使用出来ませんが、DENTACでは浮動小数点(実数)演算で使用出来ます。VCは浮動小数点演算でfmod関数が使えますが
fmod(1e99,360)=96 となって大きな誤差が出ます。
補足3:
BASIC(VB)では、-365 mod 360は-5になりますが、DENTACでは、355 になります(角度の例で解るようにこちらの方が実用的
です)。 |
|
27桁あれば、こんな計算が出来ます!
| (1) 光の速度 |
2,9979,2458 [m/s] |
| (2) 1年間の秒数
60×60×24×365.24219 |
3155,6925[s] |
| (3) 1光年の距離 (1)×(2) |
9460,5281,7742,6821[m] |
| (4) 宇宙の果てまでの距離 150億光年 |
150,0000,0000 |
| (5) 宇宙の果てまで何メートル?
(3)×(4) |
141,9079,2266,1402,3139,2000,0000[m] |
|
消費税計算も超簡単にプログラム出来ます!
| 消費税の定義 |
[TAX 5%] |
| 消費税の計算 |
1000<TAX>
50 |
| 税込み金額の計算 |
+
1,050 |
|
逆ポーランド記法は、こんな便利な使い方も出来ます!
| コンピュータのKとMの定義 |
[K 1024*][M 1024 2^*] |
| 128KB(キロバイト)の換算 |
128<K>
131,072 |
| 128MB(メガバイト)の換算 |
128<M>
134,217,728 |
|
|
DENTAC使用上の基礎知識
1) 有効桁数は3〜27桁の範囲で可変出来て、初期値は11桁です。
コマンド「27.5SN」を入力すると最大の27桁になります。「.5」は四捨五入処理を意味しています(有効桁数より2桁余分に計算して四捨五入します)。
整数の演算を行う場合、この四捨五入処理が邪魔になることもあります。「.5」を付けずに「27SN」に設定すれば、有効桁数以上の部分は切捨てになります。
2) 表示桁数は、3種類の形式で設定出来ます。
「20.05SF」で、整数部20桁、小数部5桁の固定小数点形式。
「4.20SS」で、仮数部20+1桁、指数部4桁の浮動小数点形式。
「4.20SE」で、仮数部20+1桁、指数部4桁の工学浮動小数点形式(指数部が3の倍数)。
3) 負の数値は、「_」(符号反転)キーで入力します(指数部は「-」も使用可能)。
123_ :-123
1.23E_1(1.23E-1) :0.123
4) 「,」による区切りの表示間隔を任意に設定出来ます。
「3SK」で、3桁毎の区切り、「4SK」で、4桁毎の区切り、「0SK」で区切り無し。
数値の入力でも 「,」を使用して「0」のキー入力を削減することが出来ます。
例えば、「1,2 」 で 1,200 が入力出来ます。
5) 「無限大」と、「不定」と、「空」、という例外値を次の記号で入力出来ます。
無限大:「~」、不定:「?」、空:「`」
1 0/ (1を0で割る)を実行すると、エラーにならず、「~」が表示されます。
その他の計算でも可能な限り数学の理論に近い計算結果を出力します。
メモリは初期状態で、ゼロではなく、空になっています。
空の値に加減算を行うと、不定になる(` 12+ = ?)ので注意してください。
6) 角度の単位は、初期値が「度」です。
「SR」で「ラジアン」、「SD」で「度」に切り替わります。
BASIC(VB)では必ず「ラジアン」なので、sin(180度)=sin(πラジアン)を計算すると
pi=3.141592653589793
?sin(pi)
1.22460635382238E-16
のように誤差が出ます(πが無限小数のため近似値でしか表現出来ない)。
DENTACでは、sin(180度)が
>SD
>180s 0.000,000,000,000,000,000,000,000,00E+0
と、正確にゼロになります。
実用計算では「度」の方が便利なのに、ほとんどの言語が「ラジアン」なのは、
数学的にsin関数を計算する近似式が通常「ラジアン」単位になるためです。
DENTACでは、誤差が出ないように「度」単位のsin関数計算ルーチンを内蔵
しています(見かけ上、角度単位を「度」に設定出来ても、ラジアンに換算して
から計算しているソフトでは誤差が避けられません!)。
7) 2つの動作モードが有ります。
HPモード(初期状態):演算用のスタックが4段とLASTXレジスタが使用可能。
YESモード:演算用のスタックが16段なので複雑な連続計算が実行出来ます。
「SH」でHPモードに、「SY」でYESモードに切り替わります。
8) プログラムで定義したラベル名は、<>で括って参照します。
内蔵関数が1文字のキー入力ですぐ演算されるため、ユーザー定義関数は、内蔵
関数との区別のために<>で括ります。1文字のラベル名は、先頭に;を付けて2キー
で短縮入力出来ます(<H>は、;H)。
9)
関数の後ろに入力した文字を、関数の内部で入力データとして処理出来ます。
通常の関数は、123<H>のように、数値の後ろに関数名を入力します。
特別な技法で、関数名の後ろに、( )無しで、データを入力することが出来ます。
例えば8進数の入力関数で、;o377
のように操作出来ますから、見かけ上内蔵
機能の16進数入力(&FF)と同様な操作が可能であり、能率良く計算出来ます。
(BASICでは、OctVal("377")のような記述になるので、入力の手間がかかります。)
10) 他変数出力の関数が定義出来ます。
通常の言語では、関数の入力(引数)は複数の値を渡せますが、出力(戻り値)は
一つだけしか返せません。DENTACは他変数入力・他変数出力の関数を作れま
す。従って、複素数や分数の計算をユーザー定義関数としてプログラム出来ます。
(中学〜高校の教育用に最適です。ゼロから電卓プログラムを作るのは無理だし、
最初から複素数や分数の計算機能を内蔵した電卓を使っていても、学力が向上
しません。)
11) 変数名は大文字のA〜Zを使用
通常は、A〜Zの1文字で変数を呼び出せますが、例外的にE S L の3文字は、
後ろに空白を付けて2文字で入力する必要が有ります。
例、AB+E * (A B + E * でも良い) |
カーソルキーで出来る簡単スタック操作(V2.12)
|
操作 |
画面表示 |
説明 |
|
SA |
5.000 LAST X
T D
Z C
12.000 Y B
45.000 X 0.250 A
|
スタック(左)とメモリ(右)の
内容を表示する。
キー入力した値はXに入り、
四則演算はYとXで行われる。 |
|
=^
または
↑ |
5.000 LAST X
T D
12.000 Z C
45.000 Y B
45.000 X 0.250 A
|
X→Y→Z→T
Xの値は変化しない |
|
=_
または
↓ |
5.000 LAST X
T D
Z C
12.000 Y B
45.000 X 0.250 A
|
X←Y←Z←T |
|
L_
または
→ |
5.000 LAST X
T D
Z C
Y 0.250 B
12.000 X 45.000 A
|
X←Y←Z←T
↓
A→B→C→D→・・・
メモリもスタックのように動作
するのは、DENTACの独創的機能 |
|
L^
または
← |
5.000 LAST X
T D
Z C
12.000 Y B
45.000 X 0.250 A
|
X→Y→Z→T
↑
A←B←C←D←・・・ |
|
|
DENTAC開発時のこぼれ話 その2
DENTACのべき乗関数は、賢く設計されされています。
通常、組み込み関数のべき乗は、乗算の繰り返しではなく、対数関数と指数関数を組み合わせて計算します。乗算の繰り返しでは、Xの1.2乗のような小数を含んだ実数のべき乗の計算が出来ないからです。ところが簡単な整数のべき乗の計算では、乗算の繰り返しの方が速くなります。
プログラマーは、通常頭で判断して、例えばYの3乗は、べき乗関数を使わずに、Y×Y×Yでプログラムします。DENTACでは、内蔵のべき乗関数が、整数のべき乗の計算を乗算に置き換えて計算します。
ここで大きな問題は、1000乗を計算する時に、1000(-1)回も乗算を繰り返すと、対数関数と指数関数を使って計算するよりも時間がかかる(計算誤差も大きくなる)ことです(元々対数は掛け算を簡単に行うために発明されました)。
頭の体操をすると、1000乗は、10乗を3回繰り返せばよいことに気が付きます。もう少し頭を働かせて、任意の整数のべき乗で最小の乗算回数で計算出来るように工夫しました。
べき乗計算だけでなく、計算速度と精度にこだわった演算がまだ有ります。コンピュータでは通常、平方根はニュートン・ラプソン法を使って四則演算の繰り返しで近似計算します(DENTACの標準ライブラリに付属しています)。それでは計算速度が遅くなるだけでなく誤差も発生する可能性があります
(実際には平方根は単純な計算なのでニュートン・ラプソン法でもかなり短時間で計算出来ます)。
学校で習ったように、平方根は直接筆算で計算することが出来ます。DENTACも直接平方根を計算するプログラムを内蔵しているので、速く正確に平方根を計算することが出来ます。 |
|
|
|
|
このページへのリンクバナー→
ご自由にお使いください |