LabVIEW による 2 の補数参考プログラム
(最終改訂 2022/12/19)
書庫ファイル内容
LV_complement.zipには、本稿(拡張子.pdf)、本稿掲載図およびVIブロックダイアグラムのキャプ チャ画像(フォルダFigures:拡張子.png)、2の補数関連参考VI 計23本(ファイル名がLVで始まる メインVI 7本および参照されるサブVI 16本)【2022/12/19追加】のLabVIEW2013版ソースファイ ル(拡張子.vi)、メインVIの実行ファイル(拡張子.exe)7本(LV_complement、LV_binary_counter、
LV_decimal_ring_counter、LV_BQdecimal_ring_counter、LV_map、LV_ADC および LV_ADC8b)、 設定ファイル(拡張子.ini)、実行ファイルに必要な実行時ライブラリ(フォルダdata:拡張子.dll)が 含まれている。実行ファイルは、同名の設定ファイルを(数式文字列を使用するLV_complementおよ びLV_mapではdataフォルダも)同じ場所に置いて開く(p.8備考参照)。
LV_complement
微積分学を創始した数学者Gottfried Leibniz(1646~1716)は「機械にでもできる計算などという 仕事を、貴重な人間の時間を費やしてこつこつ行うのは全く馬鹿げたことである」と述べ(原文は„Es ist
unwürdig, die Zeit von hervorragenden Leuten mit knechtischen Rechenarbeiten zu verschwenden, weil bei Einsatz einer Maschine auch der Einfältigste die Ergebnisse sicher hinschreiben kann.“
)天文学者の 時間をより創造的な作業に解放する目的で四則演算と平方根計算が可能な歯車計算機を開発した。図1左はGottfried Wilhelm Leibniz Bibliothekが所蔵するLeibnizの没後に発見された1690年頃の製作 と見られる作品で、Bonn大学計算機博物館のCG動画により内部の機構と操作を見ることができる。
https://www.hannover.de/Wirtschaft-Wissenschaft/Wissenschaft/Initiative-Wissenschaft-Hannover/Leibniz-in-Han nover/Leibniz%27-Nachlass/Leibniz-Rechenmaschine
https://www.youtube.com/watch?v=v6ruUDIeK6I
図1右はそれから200年後、Harvard College Observatory台長Edward Charles Pickeringが雇用した女性 計算手の作業風景である。写真乾板の星像をルーペで確認して三角関数表と常用対数表とを用いて星の 位置を計算する彼女らは“computer”と呼ばれたが、壁に貼られた食変光星馭者座βの1889年12月の 光度曲線の右に立つWilliamina Flemingは星表作成、天体発見により“astronomer”として名を残してい る。https://hea-www.harvard.edu/~fine/Observatory/computers.html
図1 LeibnizのRechenmaschine(左)と“computer”と呼ばれた天文台の女性計算手(右)
更に半世紀後、一般に公開された最初の電子的情報処理装置とされるENIAC(Electronic Numerical Integrator And Computer)が公開(1946年のSt. Valentine's Day)され、「人」ではなく計算する「物」
が“computer”を名乗った(図 2左)。ENIACは現在のコンピュータとは多くの面で異なり、プログ ラム内蔵方式(stored program)を採用し1949年に公開されたEDSAC(Electronic Delay Storage Automatic Calculator)が「コンピュータ」の直系の祖先と言えるが、こちらは“calculator”と称し ていた(図2中・右)。EDSACのDSは水銀管遅延メモリを指し、この装置の右が設計者Maurice Wilkes である。プログラム内蔵方式の構想自体は ALU(Arithmetic Logic[al] Unit)を提唱した John von NeumannのEDVAC(Electronic Discrete Variable Automatic Computer)の方が早かったが完成は 大幅に遅れ、プログラムカウンタも持たない同機を直系とは言い難い。
メインフレーム機の雄IBM(International Business Machines Corporation)は製品を“computer”
ではなく“Data Processing System”と呼んでいた。
図2 ENIAC一般公開翌日の報道(左)、EDSACと水銀管遅延メモリ(中、右)
ENIACは十進、EDSACは二進の機械で何れも負数の表現には基数の補数(radix complement:正 確な意味は基数の桁数冪の補数)を採用している。ENIACのアキュムレータ(20個)は十進10桁で あるが、ENIAC の数の範囲が[-5000000000,4999999999]を意味するものではなく、負数では各ア キュムレータに1010の補数を格納し必要に応じ繋げて(演算回路でこれを容易に行えるのは負数に基数 の補数を採用した場合のみである)使用する。ENIAC は「LabVIEW による手回し計算機参考プログ ラム」 https://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_pinwheel.pdf p.1註に記す様に手回し 計算機の歯車の代りに十進リングカウンタを電子的に「回している」ことをシミュレータで確認できる。
もちろん減算ではリングカウンタをOdhnerやタイガーの歯車の様に逆回転させるのではなく、減算も 正回転の補数加算で行う同p.2註のCURTAと同様に9の補数を加え最下位桁に1を加えている。
ENIAC シミュレータ http://zuse-z1.zib.de/simulations/eniac/eniac.jar (Java 実行ファイル)
http://zuse-z1.zib.de/simulations/eniac/doc/virtualENIAC.pdf (マニュアル)
CURTAシミュレータ https://satadorus.eu/x_ite/yacs_2_0/yacs_2_0.html (ウェブ上の実行)
https://www.youtube.com/watch?v=loI1Kwed8Pk (解説動画)
文字盤の動きから「基数の補数」の意味を実感できたアナログ誘導形電力量計(p.3 図 3)はスマー トメーターの普及により姿を消し、「LabVIEW による手回し計算機参考プログラム」p.13上から2行 目の日本電気計器検定所(JEMIC)のページもリンク切れとなっている。
2の補数を求める方法は教科書に①各桁を反転して1の補数(基数2のradix-minus-one complement)
を作り、②LSBに1を加える、と書かれることが多い。補数器、加減算回路での符号反転の原理を「機 械のすることを人間が行う」のは計算機の動作を理解するには有益であるが、1を加える過程で桁上げ が発生し(p.3 註参照)計算間違いを起し易く、わざわざ人間が(例えば定期試験で解答する際に)そ の通り行う必要は無い。桁数をnとして「元の数と補数とを自然2進数(符号無し整数)として加えた ものが2n」という定義から求めれば、2nもn桁の世界では 0であるから、元の数に加えて各桁が0と なる数を求めればよい。LSBから順に見て、① 0が続く間は0、②最初に現れた1に対しては1。ここ で桁上げが発生するので、③以後、MSB まではすべて 0、1
註:「最も下位にあるビット1」の位置の期待値はLSBの位置を0として桁数を増したとき1に収束し、
桁上げ伝播の長さの期待値は2に過ぎない。ただし、あくまでも「期待値」であって確率は低くとも大 きな値も出現し、MT19937乱数の標準初期値から158個目の標本では12桁伝播する(図4参照)。
図3 整数部4桁の世界でアナログ誘導形電力量計の9999が0000に復帰する様子
LV_complement.vi【MT19937.vi の過剰な参照を修正:2022/12/07】は、文字列制御器に入力した LabVIEW数式文字列もしくは16進文字列、またはMT19937乱数標本による32bデータにシフト、
反転等の操作を行ったオペランドと2の補数を得る過程について補数器の方法と定義に基づく方法とを 対比するデモVIでフロントパネルを図4に示す。
図4 LV_complement.viのフロントパネル:補数器による2の補数(左)と定義による方法(右)
ビット不均衡での停止条件“|pc-16|>”の起動時既定8は二項分布B (32,1/2)を正規分布N (16,8) で近似したときのμ±3σ超に相当する。実際にB (32,1/2)で偏差8を超える確率は約2.1024×10-3(逆
数は約476)で、他の停止条件を非停止に設定して 、 を繰返すと初回の停止が891、以下852、
619、201…と続き10回目の停止までに生成される標本の個数は4834個である(p.6図8参照)。 LabVIEWでMT19937乱数を利用する方法については「LabVIEW による乱数参考プログラム」を 参照されたい。https://www.ns.kogakuin.ac.jp/~ct13050/johogaku/LV_random.pdf
LV_binary_counter
アナログ誘導形電力量計の表示(p.3 図 3)に見る様に整数で桁数が限られている(この場合十進 4 桁)場合に、「0000を基準として逆カウントすれば、1つ前の9999は-1、2つ前の9998は-2を表 していると見る」基数の補数による負数の表現は自然である。LV_binary_counter は、正逆両方向の 8b二進カウンタ(製品例74F779)で8bit整数の6種類の表現を比較するデモVIで、誘導形電力量計 のアナログ動作の代りに「LabVIEW 概要」pp. 8-10(6. ring_counter.vi ~ サブ VI ~)の様にデジ タル波形グラフの表示で動きを与えている。ring_counter.viからクロック動作(立上りに)と押しボタ ンSW 形状(「モダン」から「シルバー」に)を変更の他、カウンタFF 設定値での一時停止機能を追 加している。https://www.ns.kogakuin.ac.jp/~ct13050/johogaku/Overview_of_LabVIEW
図5にLV_binary_counter.viのフロントパネルを示す。表現選択の6個の排他的押しボタンSW(起 動時既定は符号無しの“natural”)は256通り全てのパタンが数学的に異なる値を表す場合は緑、0に 正負2 通りの表現がある冗長な場合はマゼンタに点灯し、前者は負の数のみ符号“-”を表示するが後 者では正符号の数にも符号“+”を表示する。
計算機の世界では数も命令語もビット0が既定で1が拡張であり、符号無し整数を拡張して負数を表 す際に負数の符号ビットを1とするが、次の2個は例外である。げたばき(offset)表現は、表現する 数の大小関係が全範囲にわたって符号無し整数とみなした場合と一致する利点があり、RIFF waveform Audio Formatの8b音声データ(旧課程「正弦波合成と音声ディザテキスト」p.21参照)で使われて いる。折返し(folded)表現は、符号絶対値表現の符号ビットの正負を逆にしたもので旧電電公社のマ イクロ波回線を利用したNHKのFM放送生中継で(アナログ圧伸を加えて)利用された。音声の符号 化で敢えて逆にする利点は無く、今も電話音声PCM符号化(対数圧伸標本化周波数8kHz深度8b)の 国際規格(ITU-T G.711)では1が正、0が負である様に通信の世界の伝統である。
図5左は1の補数表現を選択して“-127”を一時停止値に設定後(一時停止するまで文字列表示器 に“1’s complement : -127 [x80]”と表示される)自然2進表現に移り“128”で一時停止した 画面である。カウンタ表示モード(起動時既定、図5左)ではフロントパネル上段の“manual input”
の値(起動時既定:(00000000)2)が変化したときに設定値表示モード(図 5 右)に移る。表現 (00000000)2が[+]0(起動時既定)に対応しない上記のげたばきと折返し表現では をクリックす れば設定値が(10000000)2に変化して設定値表示モードに移る。設定値表示モードからカウンタ表示 モードに復帰するには、 を“OFF”にするか、または をクリックして“manual input”
の値をFFに転送もしくは現在のFF値とは異なる一時停止値で を“ON”にする。
LV_decimal_ring_counter
ENIAC のアキュムレータのパネルには各桁のリングカウンタ FF の値を示すランプが下から上に 0
~9 の 順 で 並 び 、 左 端 に 正 負 を 示 す ラ ン プ ( 下 が 正 、 上 が 負 ) が 表 示 さ れ て い た 。 前 節 LV_binary_counter.viの原型ring_counter.viでは符号無しの十進2桁00~99の表示を時計の文字盤の 様に円周上に配置(計数放電管の電極と同様)している。LV_decimal_ring_counter は、FF 動作クロ ックは立ち下がりのまま変更していないが停止状態で開く設定に変えている。VIの詳細は「LabVIEW 概要」pp. 8-10を参照されたい。図6にLV_decimal_ring_counter.viのフロントパネルを示す。
図6 LV_decimal_ring_counter.viのフロントパネル:一の位の信号(左)、十の位の信号(右)
LV_BQdecimal_ring_counter
数字(digit)の語源が指(ラテン語digitus)である様に、人間は両手の指(fingerではないthumb も含めて)の数から十進法を採用した。片手では5本であるから算盤(上段の状態が2個、下段の状態 が5個)の様に2と5に分ければ(二五進:Bi-quinary coded decimal)、十進1桁につきリング カウンタのFFを3個減らすことができ、上位桁への桁上げ信号のデューティ比も50%にできる。1945 年 9 月に Bell Telephone Laboratories が出願し 1949 年 1 月特許成立の二五進リレー式計算機
(Bi-quinary system calculator:United States Patent US2486809)の操作卓にはENIACのアキュム レータのパネルと同様にランプが下から上に0~9の順で並んでいるが、真空管式のIBM 650(1953)
操作卓前のパネルのランプは算盤玉の様に五の玉に対応するFFの値が上で、一の玉に対応するFFの
値はENIACの表示とは逆に上から下に値が大きくなり、ランプ列の左右に十進数が印字されていた。
p.6図7にLV_BQdecimal_ring_counter.vi(LV_decimal_ring_counter.viと同様、停止状態で開く)
のフロントパネルを示す。リングカウンタFFの表示配置は円周上ではなくIBM 650の表示を模し(も ちろん 650 のパネルにクロックの表示は無い)、表示値が十進リングカウンタの様に直感的ではないた め上位下位両カウンタの値を連結して文字列表示器に示している。
図7 LV_BQdecimal_ring_counter.viのフロントパネル:一の位の信号(左)、十の位の信号(右)
LV_map【追加:2022/12/07】
LV_mapはビット列を一覧表示しLV_complement.viで利用したMT19937乱数についてビット不均 衡または下位に0が現れない標本を探索するデモVIで、探索中は停止ボタン(ボタン表記“HALT”) が反応できないため実行ファイルを「実行を中断」ボタンを表示する既定の設定でビルドしている。本 稿の以下の図は実行ファイルをWindows11がインストールされたPC(備考参照)で実行したキャプチ ャ画像である。図8左は、起動時既定(メニュー項目2:MT19937 U32)でビット不均衡の停止条件
“|pc-16|>”を既定の8、最初に現れるbit1位置での停止条件“LS1 ≧”を32(非停止)に設定し て“search”を10回クリックした結果で4834個目(B (32,1/2)で偏差8を超える確率の逆数の10倍 は約4756)の標本が先頭に表示されている。図8右はここで“|pc-16|>”を14に変更して“search”
をクリックして bit1 が 31 個の標本が表示された画面である。これは MT19937 が生成した標本の 41592689個目で偏差14を超える確率約1.53668×10-8の逆数に対する比は約0.64である。
図8 LV_map.viのフロントパネル:|pc-16|>8の10個目の標本(左)|pc-16|>14の標本(右)
隣接する符号間のハミング距離が1である交番2進符号(グレイ符号)はカルノー図で論理関数を簡 単化できる原理でもあるが、機械的動作部品を持つセンサーのデジタル信号出力に広く利用されている。
p.7図9左はメニュー項目1:reflected binaryで初期値x7F(127)の降順でビット一覧の下位7bを表 示したもので、1947年11月にBell Telephone LaboratoriesのFrank Grayが出願し1953年3月特許 成立のパルス符号通信(Pulse Code Communication:United States Patent US2632058)のFIG.2の 符号化マスクのパタン(フロントパネルのスクロール無しで表示されるのは42個)に相当する。
32b = 2 4:MC random)は簡便なこと
は極端に短くなり(「LabVIEW による乱数参考プログラム」p.6)図9右はこれを示したものである。
図9 降順の交番2進符号(左)、乗算合同法の乗数の選択と周期(右)
LV_ADC【追加:2022/12/16(修正2022/12/19)】
LV_ADCは、前節の米国特許US2632058の7b符号化マスク(または接点プレート)を2Dピクチ ャに表示し、これに電子線が入射(または接点が接触)する場合の自然2進符号と交番2進符号による AD変換の結果を比較するデモVIで2Dピクチャの表示はUS2632058の図に揃え左が上位ビット、上 端を最大値127としている。
入力設定で左右両端の画素座標を一致させる “ON”(起動時既定)の状態はパタンの形状に誤差 が無く幾何学的に正確に電子線が入射または接点が接触する理想的な場合に相当し、何れの符号化でも 全域で誤差を生じない(入力の設定から出力確定まで2ループの遅延があり垂直数値スライドを高速で 操作すると途中で出力値(ラベル“output”)のテキスト背景色がマゼンタで表示される瞬間がある)。 左右の設定が異なっていてもその差が軽微な場合に交番2進符号のパタンでは常に左右の設定値の何れ かを出力できるのに対し自然2進符号のパタンでは何れの設定値とも乖離した値となる可能性がある。
図10は起動時既定の画素座標319(想定デジタル値64)で“link”をOFFにして右端の画素座標を 2増加(下に移動)し321(同63)とした場合で、自然2進符号のパタンでは全ビットが1となり入力 から程遠い127を出力するのに対し交番2進符号のパタンでは左端想定値の64を出力する。同様に画 素座標が左320(同63)、右318(同64)では自然2進符号では32、交番2進符号では63を出力する。
図10 LV_ADC.viのフロントパネル:自然2進符号化パタン(左)交番2進符号化パタン(右)
LV_ADC8b【追加:2022/12/19】
LV_ADC8bはLV_ADCの深度を8bに拡張しフロントパネルのサイズがFHDデスクトップに収まる
(同時にLV_ADCをWXGAで表示できる様に修正)様に横をビット値(右端が最大値255)としたも
のである。LSBのマスクパタンの色には茶色(重水素核融合が短期間行われる褐色矮星:brown dwarf は赤色星よりも低温で抵抗のカラーコードも黒、茶、赤の順である)を割当てている。p.8図11に上端、
下端の画素座標がそれぞれ640(想定デジタル値128)、637(同127)の場合のフロントパネルを示す。
図11 LV_ADC8b.viのフロントパネル:自然2進符号化パタン(左)交番2進符号化パタン(右)
備考
ランタイムエンジンについて
実行ファイル(スタンドアロンアプリケーション:拡張子.exe)を開くにはLabVIEW2013ランタイ ムエンジン(ファイル名:LVRTE2013std.exe、ファイルサイズ:257 MiB)を以下の場所からダウン ロード(アカウント登録不要)してインストールする。
http://ftp.ni.com/support/softlib/labview/labview_runtime/2013/Windows/LVRTE2013std.exe
LabVIEWとWindows 各版相互の互換性について National Instruments社が保証している版は、
Windows10に対してLabVIEW 2015SP1以降、Windows11に対応する版は現在LabVIEW2022Q3の みである。ソース VIの編集ではなく単に実行ファイルを開くだけであれば、対応するランタイムエン ジンをインストールすることでWindows11のPCであってもLabVIEW旧版で作成した実行ファイル が問題なく動作する。
図12はLV_random.vi(「乱数参考プログラム」)、EulersEquation.vi(「概要」例11)のLabVIEW7.1 版原型の実行ファイルをランタイムエンジンをインストールした Windows11 の PC で開いた画面で、
“Help”→“About..”(日本語版では「ヘルプ(H)」→「バージョン情報..」)で表示される起動画面から
LabVIEW7.1のランタイムエンジンで実行されていることが分る。
図12 LabVIEW7.1実行ファイルのWindows11での実行画面
フォント指定について
LabVIEW では、作成時のフォントと実行時のフォントが異なる場合、文字列が枠に収まらない、揃
えて配置した複数の配列が斜めにずれるなどのレイアウトの乱れを生じる。このため、実行ファイルは 以下の 4 行が書かれた同梱の設定ファイル(VI と同じファイル名で拡張子が.ini)を実行ファイルと 同じ場所に置いて開く。
[VI ファイル名(拡張子無し)]
appFont="MS UI Gothic" 12 dialogFont="MS UI Gothic" 12 systemFont="MS UI Gothic" 12
ソースVIを開く場合【2022/11/12追記】は、メニューバーで「ツール」→「オプション」(英語版で は“Tools”→“Options”:以下同)の「環境」(“Environment”)カテゴリから「フォント」(“Fonts”)
の「デフォルトフォントを使用」(“Use default font”)のチェックを外し「フォントスタイル」(“Font Style..”)をクリックし、フォントスタイルウィンドウのドロップダウンメニューで「アプリケーション フォント」(“Application Font”)、「ダイアログフォント」(“Dialog Font”)、「システムフォント」(“System
Font”)のそれぞれで上記のフォントとサイズに設定後、LabVIEWを再起動する。
LV_complement.viのソースVIについて【2022/11/12】
実行ファイルのみを公開した2022/10/28版の “ON”でオペランドの連続増減時に定義モード での動作が異常に遅くなった原因は、同一Forループで2種類のユーザ指定フォントを使用したことに あることが分り指定フォントをMS UI Gothic 32に絞り、2022/11/12版でソースVIを公開した。