実現したいこと

数値計算において、行列は避けて通れないだろう。それで、C#で行列クラスをちゃちゃっと作り、行列を用いてアルゴリズムを書くのだが、効率の悪いプログラムができあがる。それを直すこともできるが、そうするとプログラムの見通しは悪くなる。
行列に限らず、このようなことはあるだろう。
「実現したいこと」は、なるべくシンプルに記述するべきである。それをどう実現するかよりも記述のシンプルさに重点を置くことも必要である。
例えば、「min cTx; s.t. Ax<=b; を内点法で解く」。この日本語の要求をコンピュータで直接実行はできない。そこで、プログラミング言語で記述し、コンパイラマシン語に翻訳して実行することになる。翻訳という作業は知的であるが機械的である。将来的には、この翻訳作業がシームレスかつ高度になっていくであろう。例えば、効率の悪い行列のプログラムは、自動的に効率のよいものに翻訳されるだろう。行列演算で書かれた内点法のプログラムは、自動的に疎行列でもfill-inが少ないアルゴリズムに翻訳されるだろう。実現したいことを意図している人は、シンプルな表現の方の意図を保持しメンテナンスすべきである。
とはいえ現状では、高度に知的な自動翻訳はないので、プログラマが代行しなければいけない。
ドットネットだけで、実現できるわけではないが、ドットネットはこの方向に向かっているように思う。 Javaも同じ方向を向いているだろう。私には、Javaは理想と現実のバランスが悪い。C#の方がバランスよく感じられる。


double.NaNは、IsNaNでチェックすること。下記は、2番目はfalseである。その他はtrue。 double d = double.NaN;
Console.WriteLine(double.IsNaN(d));
Console.WriteLine(d == double.NaN);
d = double.PositiveInfinity;
Console.WriteLine(double.IsPositiveInfinity(d));
Console.WriteLine(d == double.PositiveInfinity);