• Tidak ada hasil yang ditemukan

LabVIEW による多倍長演算参考プログラム

N/A
N/A
Protected

Academic year: 2024

Membagikan "LabVIEW による多倍長演算参考プログラム"

Copied!
7
0
0

Teks penuh

(1)

LabVIEW による多倍長演算参考プログラム

(最終改訂 2020/09/27)

書庫ファイル内容

LV_MP.zipには、本稿(拡張子.pdf)、本稿掲載図およびVIブロックダイアグラムキャプチャ画像(フ

ォルダFigures:拡張子.png)、LabVIEWによる多倍長演算VI(LV_MPおよびサブVI)、畳み込みと 乗算過程の関係と誤差のデモVI(LV_mult3d、LV_conv_test、LV_conv_precおよびサブVI)のソー スファイル(拡張子.vi)、実行ファイル(拡張子.exe)、設定ファイル(拡張子.ini)、実行時ライブラリ lvanlys.dllを含むdataフォルダのLabVIEW2017版(情報科学研究教育センター(以下「センター」

と表記)での実行にはランタイムエンジン不要)およびLabVIEW2013版(ランタイムエンジンのダウ ンロードにNational Instruments社(以下「NI」と表記)のアカウント登録が不要)がそれぞれフォ

ルダLV2017およびフォルダLV2013に格納されている。実行ファイルは同じ場所に設定ファイルおよ

びdataフォルダを置いて開く(p. 7備考参照)。

LV_MP

今から45年前、Scientific American誌1975年4月号がM. Gardnerの看板コラムMathematical Games に掲載した“Six sensational discoveries that somehow or another have escaped public attention.”は、最後の“psychic motor”に到達すれば誰しも四月馬鹿の冗談と分るが、Gardnerに届い た数千通の手紙は内容を真に受けて驚嘆するか誤りを指摘するものであった。とりわけ反響が大きかっ た最初の話題「四色問題」(「四色定理」の未解決当時の訳語)の counterexample(プログラムを用い て実際には塗り分けられることを示す動画は註参照)では、K. Appel、W. Hakenにより肯定的に解決 された翌1976年、「Scientific Americanに反例が出ていたから証明が誤りだろう」と新聞社に投書す る読者(信者)がいた程である。

註:“Using a SAT solver to color a map” https://www.youtube.com/watch?v=0gt503wK7AI

6個の中でおそらく最高傑作と思われるのは2番目の“In number theory the most exciting discovery of the past year is that when the transcendental number

e

is raised to the power of π times , the result is an integer.”であろう。本文中の値262,537,412,640,768,743.999,999,999,999,….は正し いが、実際に9が続くのは“….”の前の12桁のみである。この数が整数に近いことは単なる偶然では なく楕円モジュラー関数の理論的な背景があり、当時の計算機の数値精度で最良であった IBM System/370のextended precision(仮数16進28桁)を用いても基数16の欠点(2進で見れば1/4の 確率で3ビットが死ぬ)と組込関数の演算での誤差累積を考慮すると「実際に値を確認するには不足か」

と思わせる絶妙な数であった。

R. Brent(1976年、E. Salaminと独立に算術幾何平均により2次の収束をする円周率計算公式を導 いた計算機科学者)がFortran66版多倍長演算パッケージMP(p.2註1参照)を公開し、多倍長演算 プログラムを一般ユーザが組む必要が無くなったのは1978年である。当時は使用可能なメモリ空間も

最大16MiB(共同利用の計算機では高々4MiB程度)と小さくMPは計算量が桁数の自乗に比例する通

常の乗算アルゴリズムを用いていたが、メモリ価格の低下により畳み込み演算(次項LV_mult3d参照)

を高速フーリエ変換(FFT)で行う乗算パッケージが一般的になり、D. SmithのFortran95によるFM

(p.2註2参照)はその代表である。手軽な任意多倍長の電卓プログラムでは、B. DelaneyのMPCalcRB がMac OS X、Linux、Windows用に公開されており(http://delaneyrm.com/MPCalcRB.html)、内部 精度および出力精度(起動時既定はそれぞれ32、16)を100と50に設定して1 6 3 sqrtx Pi * e^x を入力した結果は262537412640768743.99999999999925007259719818568888となる。

(2)

註1:R. P. Brent : A Fortran multiple-precision arithmetic package, ACM TOMS, 4 (1978), 57-70.

https://maths-people.anu.edu.au/~brent/pd/rpb042.pdf :ACM Collected Algorithms登録時のオリジ ナルMP(1977/02/17版)は注釈行、テストプログラムを除き3357行で、現在の登録版MPは1978/08/02 修正版(同3706行) http://netlib.org/toms/524.gz で、最終版(同4548行)はBrentのページから ダウンロードできる https://maths-people.anu.edu.au/~brent/ftp/rpb043/rpb043.zip 。

註2:http://dmsmith.lmu.build/FM1.3/FM_files.zip :D. M. SmithのFMは引数が複素数に拡張され、

サブルーチンとモジュール定義は注釈行・空行を除き 99805 行(2017/10/17 版)ある。任意多倍長で はなく有効数字50桁固定のiPhone / iPad専用ではあるが、グラフ表示も可能なRPN電卓Calc-50が App Storeで公開($1.99)されている http://dmsmith.lmu.build/Calc-50.html 。

LV_MPは乗算に畳み込みを用いた多倍長演算デモVIで、使用しているアルゴリズムについては次の

URL(R. P. Brentの1976年の最初の報告と1999年の講義資料)を参照されたい。

https://maths-people.anu.edu.au/~brent/pd/rpb034.pdf

https://maths-people.anu.edu.au/~brent/series99/lec01-06.pdf

図1は、前述のexp(pi(sqrt(163)))をLV_MPで50桁精度で求め、48桁に丸めて文字列表示した例で

(本稿掲載の実行画面は、ソースVIではなく実行ファイルをセンターのバーチャルカフェテリアで実 行してキャプチャしたもの)、既定の状態でツールバーの実行ボタン(⇨)をクリックの後、① 文字列 制御器“Str_in”に163を入力し“X←str”ボタンをクリック、②“sqrt(X)”、“pi(X)”、“exp(X)” の各ボ タンをこの順にクリック、③ 文字列制御器“comment”に48を入力し“str←X”ボタンをクリックの後、

制御器クラスター“X”の仮数部配列“fraction”の水平スライドを操作して下位桁を表示し“Str_out”の 丸め結果と比較している。

図1 LV_MP既定の50桁精度の設定でexp(pi(sqrt(163)))を48桁に丸めて文字列表示する例

仕様は次の通りで、効率よりも単純さを重視しており大きな桁数での実行は実際的ではない(“digits”

100000の場合、バーチャルカフェテリアでの実行で初期化に35秒かかる)。各VIのブロックダイ

アグラムのキャプチャ画像はFigures¥MPフォルダ中にある。

多倍長表現の基数は配列要素に詰められる限りできるだけ大きく取るのが効率的であるが、入出力が 単純で誤差の変動も小さい10とする。

多倍長数は、符号(正負、0)、指数、仮数のクラスターで表現する。2 次収束の初期値として EXT 型の関数値(MPapprox_BD.png 参照)を用いるため、ダイナミックレンジはEXT型を超えることは

(3)

できない。仮数“fraction”の範囲は[1,10)ではなく[0.1,1)とする(「LabVIEWによる基数変換参考プ ログラム」p.5参照)。

実行ファイルは停止状態で開き、ツールバーに「実行を中断」(“Abort Execution”)ボタンを表示し ない設定でビルドしている(LV_mult3d、LV_conv_test、LV_conv_precについても同様である)。停止 中に仮数部桁数をフロントパネル左上の数値制御器“digits”(既定は50:実行中は無効化される)で設 定する。

Hewlett-PackardのRPN電卓を模し、多倍長数のオペランドはX, Y, Z, Tのスタックとする。

スタック操作“Enter”(表記“⇧ Y←X””)では、T←Z、Z←Y、Y←Xの順でコピーされTの内容は 失われるが、逆方向のスタック操作“RDN”(表記“⇩ roll down”)ではその左にある SW“cyclic”が

ON(既定はON)の場合にXは蒸発せずTに回る。

スタック操作“exchg”(表記“X⇔Y”)ではXとYの内容が交換され、関数、四則演算が行われた直 後のスタック操作“LST_arg”(表記“↷ Last arg”)ではスタックがシフトし直前の引数がX(“Y^X”、

“base Y log(X)”、“atan2(Y, X)”、および四則演算ではYにも)に格納される。

制御器クラスター Xの符号はテキストリング(ラベル“sign”、データ型I16)で設定し、負(値-1 は項目表示部分のクリックで一覧表示しても選択できない)は、増分/減分ボタンにより設定する。

スタック X の値の入力では、1 桁ずつ配列要素に設定する他、文字列制御器“Str_in”の文字列から

“X←str”ボタンのクリックで転送する。文字列(数値と解釈できない場合Xは0となる)は直接入力 または右の“paste”ボタンをクリックしてクリップボードから貼り付ける。文字列中の有効数字が

“digits”を超える部分は丸められ、%以降の文字列は注釈として無視される(str2MP_BD.png参照)。

“str←X”ボタンのクリックでXの値を文字列制御器“comment”の文字列を注釈として%以降に付加 し文字列表示器“Str_out”に転送する。“comment”の先頭が“digits”未満の正数の場合、有効数字をこ の長さに丸め(MP2str_BD.png参照)、p.2図1の例では有効数字48桁に丸められる。“Str_out”の内 容は、“str←X”ボタン右の“copy”ボタンのクリックでクリップボードへコピーされ、同じ例でクリップ ボ ー ド の 内 容 は 次 の 様 に な る 。+2.62537412640768743999999999999250072597198185689 E17 %48

桁数の小さい乗算(VIの“digits”入力端子の値が84以下)では、コンボリューションVIのアルゴ リズムでFFT使用の“frequency domain”ではなく古典的な“direct”を選ぶ(MPmul_BD.png参照)。

開始直後の初期化(設定桁数に応じた精度でlog2とπを計算:MPinit_BD.png、MPpi_ln2_BD.png 参照)と演算中は“busy” LEDが点灯し、押しボタンSWは無効化される(文字列制御器は無効化され ず入力はできるが転送ができない)。

三角関数の引数、逆三角関数の関数値は弧度のみとし、度数法は扱わない。

関数“Y^X”は指数関数と対数関数の組合せで求めており(0^0は定義により1としている)、Yが負 の場合Xが整数であっても結果はエラーとなる。

明示的な四捨五入丸めは加算と乗算(MPadd_BD.png、MPmul_BD.png参照)で行われ、両演算を 参照する他の演算への丸めの効果は間接的である。

LV_mult3d

被乗数、乗数が各N桁の古典的な乗算は、1桁ずつのN 2個の積を位取りに応じた重みで和を取るこ とで行い、計算量は1桁の乗算(10進では九九)の計算量を1とするとき加算と正規化の計算量を無 視してN 2である(N 2アルゴリズム)。筆算では(註参照)被乗数全体と乗数1桁との正規化された(各 桁が基数未満)乗数桁数個の部分積の桁位置を縦に揃えて記し、その和として全体の積を得る。

註:「4人が1人100mずつ走ってつなぎました。走った長さは合せて何mですか」という文章を式に 立てる問題が与えられたとき、日本の小学校では100×4=400が正解で4×100=400は誤答になる。

これを“4 × 100 metres relay”と称する様に欧米では数式の乗算記号“×”の左がmultiplierであり、

“×”の右を乗数とする日本とは逆である(「LabVIEWによる手回し計算機参考プログラム」p.5参照)。 ただし、筆算では数式とは異なり、欧米も日本も共通に下段がmultiplierで乗数を意味する。

(4)

正規化しない部分積の重みを付けた和(これも正規化しない)は畳み込み演算(時間領域の2本の離 散的な信号の場合、一方の時間軸を逆にして対応する要素の積和を求め、対応をずらしながら新たな信 号を得る)に他ならない。畳み込み演算は、変数を共役量(時間領域の離散信号であれば離散フーリエ 変換で周波数領域)に変換すれば要素毎の積(対応要素の漏れが無い様に端にN -1個の0を補うが計 算量はN 2ではなくNのオーダー)であり、Nが大きい場合はFFTによる離散フーリエ変換・逆変換

(計算量はそれぞれN logNのオーダー)のコストを考慮しても変換して処理し逆変換で戻す方が(N がシステムで扱えるFFTのサイズを超える場合には分割して処理する)圧倒的に有利である。

本来の用途が計測制御用ソフトウェアの開発である LabVIEWには畳み込みの関数 VI(パレットは

「関数」→「信号処理」→「信号操作」→「コンボリューション」:既定のアルゴリズムはFFT使用の

“frequency domain”で、N 2アルゴリズムの“direct”も選べる)が備わっており、畳み込み演算に変換・

逆変換のVIを用いる必要はない。

図2に10進3桁の乗算過程表示デモVI LV_mult3d.viの起動時既定の画面(被乗数789、乗数345)

を示す。乗数各桁および対応する部分積の色を個別に指定(実行プログラムは停止状態で開き、色指定 用の画面右端のカラーボックスは実行中グレーアウトする)するため乗数では被乗数の様な配列ではな くクラスターを使用しているが、クラスターのサイズを動的に変更することはできないため桁数を3に 固定している。

古典的なN 2アルゴリズム(図左ブロック)では、部分積を正規化しない形(9個の要素は1桁の積 そのままの35 40 45、28 32 36、21 24 27)で求め、重みを揃えた和(21 52 94 76 45:畳み込み結果 に相当)を正規化して積(272205)を得ている。離散フーリエ変換による畳み込み演算(図右ブロック)

では、被乗数・乗数への0付加(この例では3-1=2要素ずつ装飾枠内に追加)、離散フーリエ変換(結 果は複素数)、変換結果の要素毎の積、離散フーリエ逆変換(結果は実数)で畳み込みを得るまでを示 している。

図2 10進3桁の乗算過程(被乗数789、乗数345):N 2アルゴリズム(左)、離散フーリエ変換(右)

LV_conv_test

多倍長数の仮数部をサイズNの配列で表すとき、多倍長表現の基数Mはできるだけ大きく取るのが 計算量は(基数変換を無視して)少なくなる。畳み込み演算に誤差が無ければ、N (M-1)2が整数とし て正確に表現可能な数(DBL型では253 -1以下)であればよいが、以下に見る様に最悪で10b程度の 累積誤差を生じる。畳み込み演算 VIの誤差を評価するために「真値」を N 2アルゴリズムで得て比較 するのは実際的ではない。

LV_conv_testは、DBL型配列要素に10進または2進でd桁を格納するとき、結果を容易に構成で きる被乗数と乗数の全要素がα=M-1 である乗算(積は (MN -1)2。畳み込みの結果はβ=α2としてサ イズ2N-1の配列 [β,2β,3β,…,(N-1)β, Nβ,(N-1)β,…,3β,2β,β]となる:この畳み込みが誤差最

(5)

大である保証は無い)を用いて、整数に丸めた畳み込みが正しくない結果を与える最小のNを推定する デモVIで、図3に既定の起動画面を示す(数値ライブラリの版が異なるLabVIEW2013版VIでは値 が異なる。LV_conv_precについても同様)。仕様は次の通りである。

図3 LV_conv_test起動時の画面:M=105のとき(MN -1)2を正しく得られない最小のNは1459

実行ファイルは停止状態で開き、パラメータをフロントパネル左端の制御器で停止中に設定する。設 定用の制御器は実行中無効化される(LV_mult3dのカラーボックスの様にグレーアウトはしない)。

数値制御器クラスター(ラベル“test range”)で配列サイズ Nの検査範囲を指定する。2個の要素 N0、N1の大小関係は自由であり、範囲を繋いで検査する場合には停止中に一方のみを変更すればよい。

メニューリングの項目(“binary” /“decimal”:既定は“decimal”)で2進または10進を選択し、数 値制御器(キャプション“digits per element”)で1個の配列要素に格納する桁数d(1≦d≦18:既定 は5)を指定する。既定の基数Mは105である。

ツールバーの実行ボタン(⇨)のクリックで開始し、① min(N0, N1)β≧253のときは実行開始時に

“overflow”を点灯し停止、② 検査範囲に正しい畳み込み結果を得られないNがあるときは、最初に検

出されたNで円LED(ラベル“error”)が赤色に点灯し停止、③ 検査範囲の全てのNについて検査が

終了すれば停止、④ パネル左上の押しボタンSW(表記:“HALT”)のクリックで強制停止する。

前項②~④の場合、min(N0, N1)から停止するまでのNで、左に誤差が最大である畳み込み結果の誤 差(計算された畳み込みと真値との差:タイトル“convolution error”)、右に誤差グラフ(タイトル

“maximum error”)およびN (M-1)2 で規格化した誤差グラフ(タイトル“normalized error”:註参 照)を表示する。グラフのカーソルはそれぞれのグラフの縦軸で最大値を与えるN(最大を与えるNの 値が複数ある場合は最大のもの)に位置する。④で停止した場合、Whileループ内のフローとは非同期 なため停止時に“convolution error”の“MP array size”の値と“maximum error”グラフのカーソルX の値が一致しない場合がある

註:誤差をN (M-1)2 で規格化したとき、正しい結果が得られる限界は、誤差の累積が無ければ単純な 切捨てで2-53、最近接丸めで2-545.55×10-17である。グラフに示される様に、小さなNでは2-53 未満の場合もあるが、実際の誤差は(Nの値により変動するが)これよりも10b近く大きな値に達する。

メニューリングの項目(“linear” /“logarithmic”:既定は“logarithmic”)でグラフ横軸のスケール を選択する。縦軸は対数スケールに固定されている。

停止時に制御器を操作しても実行された結果の表示には反映しないが、表示器の直接操作(配列の垂 直スクロールバー、グラフの「グラフパレット」、「Xスクロールバー」、「カーソル凡例」の操作等)は 反映し、パレットを操作する前の既定の設定でグラフ画面の垂直カーソルをクリックしてドラグすれば 個々のNに対する畳み込み誤差を読み取ることができる。

(6)

LV_conv_prec

畳み込み結果のサイズ2N-1の配列の要素の誤差の最大値が0.5を超えるとき、これを丸めた整数と の差は単なる見掛けの誤差に過ぎないが、LV_conv_testで求めた最大オペランド(被乗数、乗数が共に

MN -1)での誤差が小さければ(ここでは 0.25未満とする:0.25 以上のとき最大オペランドでの誤

差のプロット色と数値表示器の背景色を赤で警告表示する)真の誤差と見てよい。

LV_conv_prec は、多倍長の被乗数と乗数をランダムに生成して畳み込み演算の(見掛けの)誤差の

変動を最大オペランドでの誤差と比較するデモVIである。乱数生成器にはMT19937(MT19937.vi 、 MT19937_init.viおよびMT19937_gene.viを参照する:「LabVIEWによる乱数参考プログラム」参照)

のU32出力を用い型変換関数(type cast function)VIで標本を構成するため、多倍長表現の基数Mは 28または 216のみとし、基数 28で奇数の配列サイズを設定したときは実行開始時に偶数に強制される

(LV_conv_prec_BD.png参照)。図4に既定の起動画面を示す。

図4 M=216、N=10000 のMT19937乱数によるランダム標本1000個の畳み込み誤差の例

図5はM=216、N ≧10の条件で規格化した誤差が最小となる配列サイズN=13をLV_conv_testで 求め(図左)、このパラメータでLV_conv_precを実行しランダム標本の誤差を最大オペランドの誤差と 比較(図右)した例である。

図5 最大オペランドでの誤差が小さいNに対してはランダム標本での誤差が大きく上回る場合がある

(7)

備考

ランタイムエンジンについて

LabVIEW の実行ファイル(スタンドアロンアプリケーション)を開くには当該バージョンの

LabVIEW本体またはランタイムエンジンと当該バージョンの実行時ライブラリlvanlys.dllが必要にな

る。センターのPCにはLabVIEW2017がインストールされており、LV2017フォルダ中の実行ファイ ルをそのまま開くことができるがLV2013フォルダ中の実行ファイルは開けない。

個人所有PCでLabVIEW2017版実行ファイルを開くにはバーチャルカフェテリア(本学の学生は特

別な利用申請無しに利用可能)にログインするかまたは以下のページでNIユーザアカウントを登録し てダウンロードしたLabVIEW2017ランタイムエンジンをインストールする。

ダウンロードページ:http://www.ni.com/download/labview-run-time-engine-2017-sp1/7191/en/

ファイル名:LVRTE2017SP1_f3Patchstd.exe、ファイルサイズ:363.29 MiB

NIユーザアカウントの登録に抵抗のある人は次の場所からLabVIEW2013ランタイムエンジンをダ ウンロード(登録不要)、インストールしてLV2013フォルダ中の実行ファイルを開く。

http://ftp.ni.com/support/softlib/labview/labview_runtime/2013/Windows/LVRTE2013std.exe ファイル名:LVRTE2013std.exe、ファイルサイズ:257 MiB

フォント指定について

LabVIEW では、フォントを VI の作成時に明示的に指定することもできるが、通常実行ファイルを

作成する場合には(指定フォントがインストールされていない環境では表示できなくなるため)OS 既 定のフォントを使用しており、作成時のフォントと実行時のフォントが異なる場合、文字列が枠に収ま らない、配列が斜めにずれるなどのレイアウトの乱れを生じる。以下の4行が書かれた同梱の設定ファ イル(VIと同じファイル名で拡張子が.ini)を実行ファイルと同じ場所に置いて開くこと。

LV2017版設定ファイル

[VIファイル名(拡張子無し)]

appFont="メイリオ" 17 dialogFont="メイリオ" 17 systemFont="メイリオ" 17

LV2013版設定ファイル

[VIファイル名(拡張子無し)]

appFont="MS UI Gothic" 12 dialogFont="MS UI Gothic" 12 systemFont="MS UI Gothic" 12

Referensi

Dokumen terkait