July 3, 2009

William J.Cody, Jr & William Waite, "Software Manual for the Elementary Functions", Prentice Hall

[ Amazon ] ISBN 0-13-822064-6, \?

cody_waite_elementary_functions.jpg

 ワシの手元にあるものは1992年に御茶ノ水の丸善で購入したもので,当時でも14790円だった。Amazonを検索してみると,古本でも万単位の値が付いているから,結構貴重なものなのかも知れない。もちろん,購入当時は「珍しい本があるもんだ」ぐらいにしか思ってなかった。本書のFirst authorが数値計算ソフトウェアの大御所であるとはこの度の訃報を見るまでは殆ど知らずに過ごしてきたのである。詳細はC.Molerの記事中にあるインタビュー記事を参照されたい。以下,この記事中にある情報はそれを斜め読みして得た知識が殆どである。

 オープンソースの源流というのを辿っていくと,これは殆ど誰も言及していないようなのだが,数値計算ソフトウェアの配布という「習慣」に行き着くことが多い。1990年代までは,日本でも数値解析シンポジウムとかでソフトを配布するということが普通に行われていた。その大本を辿っていくと,どうやらこのCodyが行ってきた研究活動に行き着くようなのである。
 朝鮮戦争から戻ってきたCodyはオクラホマ大学の数学科で修士号を,ノースウェスタン大学でPh.Dを取得して,原水爆の研究で有名なロス・アラモス研究所で仕事をした後,1991年に引退するまでアルゴンヌの国立研究所で研究者として過ごした。1960年代から,シュレジンガー方程式の計算をするうちに既存の初等関数に問題が多いことを知り,1964年に論文「CDC-3600向け倍精度平方根計算」("Double Precision Square Root for the CDC-3600", ACM Vol.7, 1964, pp.715-718)を掲載,ここから初等関数・特殊関数の計算法の研究を本格的に開始することになる。CDCやIBMのマシンを使いつつサポートもする必要があったため,互換性を重視しつつ性能を落とすことがないよう,マシンごとの特性を事前にチェックするサブルーチン"MACHAR" (Machine Characteristicの略?)を作成したりと,地味だが重要な仕事をしてきた。後にEISPACK(行列固有値計算サブルーチン集)の開発も手伝い(というよりコードはかなり書いたみたい),これが連立一次方程式解法ライブラリLINPACKと統合されてLAPACKとなる。で,今もMACHARはBLASに残ってたりする
 Cody自身の仕事として誇れるものは,このMACHARと特殊関数ライブラリSPECFUN,実数関数ライブラリELEFUNT, 複素関数テスト用プログラムCELEFUNTということだそうだ。IEEE754-1985や854の規格制定では議長として場を仕切っているが,W.Kahanの発想を生かしただけと控えめな感想を述べている。
 話が横道に逸れてしまったが,SPECFUN, CELEFUNTは論文のページからソースコードが今でも無料でダウンロードできるし,LAPACKは言わずもがな。この源泉は,Codyが計算センターでサポート業務の一環としてプログラムを配布していたことにあるようだ。本人曰く,「税金で造ったものはpublic domainにすべき」というポリシーだそうな。これは本人の性格もさることながら,Abramowitz & Stegunの"Handbook of Mathematical Functions"がそうであるように,アメリカ合衆国の理念に通じるところがあるように思える。国家が造ったものはpublic domainにすべきって考え方,USA発祥・・・なんでしょうか? この辺になるとワシもよく分らないが,どうも本人の意志によるというよりごく当たり前の常識ということなんじゃないかと思える。もちろん,数学理論には特許が降りないためにビジネスとしては成り立たなかったから,という事情も手伝っているとは思うんだけど,どーもソフトウェアは望む人にタダで配るという伝統はこのあたりから始まっているんじゃないのかなーと思えるのだ。山形浩生さんとか八田真之さんあたりが調べてくれないかしらん?

 で,本書である。あの気むずかしなKahan先生もテキストとしてご愛用したという本書は,ELEFUNTの解説本という位置づけになっている。初等関数の計算法は様々なものがあるが,本書で述べられているのは最良近似多項式に基づくものが殆どである。最新の研究結果はMullerの本にコンパクトにまとめられているが,そこでomitした近似多項式の係数表はCodyの本とかに譲るとしている。本書では平方根から始まって,log, exp, power, sin/cos/tan, asin/acos/atan/atan2, sinh/cosh/tanhの計算法が章ごとにフローチャート付きで解説されている。最良近似多項式は固定小数点数,浮動小数点数,10進,10進以外の場合と細かく分類されて提示されており,もー細かい細かいノウハウがぎっちり書き込まれていて,とうてい自分で造ろうという気分にはさせてくれない代物である。使用する固定・浮動小数点数の桁数に応じて近似多項式の係数も2~3パターンで提示されていて,全てHorner法を使って最小の計算量で済むよう計算せよと書いてある。・・・お見それしましたとしか言いようがない。和書でも山下真一郎によるものとか浜田穂積によるものもあって,まー,細かい細かい。その細かさの源泉はCodyにあるんだなとよく分ろうというものである。
 何でこんなに厳密かつ多項式計算一つにもこだわんなきゃいかんのかというと,プログラムによる計算の正確さと計算速度が初等関数のそれに大きく依存しているからである。角度計算一つとっても逆三角関数が不正確ではどうしようもない。呼び出し回数も多いから高速であることが重要。現在のCPUではハードウェア内部でマイクロコードによって初等関数は計算されるが,Intel CPUですら普通の四則演算より数十倍の計算時間がかかるのが普通である。高速性と精度維持が必須の機能を担っている初等関数の計算とCodyが格闘せざるを得なかったのは,コンピュータ黎明期においては必然だったのかもしれない。本書では関数のチェック方法についても細かく記述があり,これは類書では見あたらない貴重なものである。カシオさんとこのチップはちゃんとこのテストはクリアしているのかしらん? 10進ベースの係数表はホント,貴重ですから揃えておいた方が良いですぜ。

 墓石には「Family man」と刻んで欲しい,と言い残して世を去った穏和な研究者に,哀悼の意味を込めてこのぷちめれを東洋の片隅からお送りしたい。

Posted by tkouya at July 3, 2009 11:18 PM