単位の話

だいぶ前に書こうと思って書き忘れてたのを今頃書いてみたり.
ishisaka さんが Units of Measure をいたくお気に入りの様子.

F#のUnits of MeasureはそれだけでF#を勉強してもいいと思えるぐらいすごいんだけど、世の中的には反応薄いか。無事ね素アプリばっか作っているプログラマに見せてもだめなんだろうなぁ

素アプリすらまともに作れていない気がする自分ですが,単位込みで計算するという発想自体は割と何度も目にしている気が.例えば Mathematica 使いで,単位込みの計算ができることを知らない人はモグリさんじゃなかろうか.

他にも,C++ で以前お世話になっていたヘッダファイルに,SystemOfUnits.h というものがあります.こいつは高エネルギー物理業界で広く使われている C++ 用ライブラリ CLHEP の一部で,厳密に次元のチェックをしてくれるわけではないものの,ソースコードの見た目上はなんとなく単位付きで書いてあるように書けるというもの.
(追記)まああるだろうなぁと思って見てみたらやっぱり boost にもありました.こっちは型チェック有りっぽい.

長さも重さも変数の型は double で表現していて、 うっかり引数の順番を間違えてしまったりすることは無いでしょうか。 ちょっと複雑な物理シミュレーションの式を書いていて、 掛け算を1個忘れてしまったりすることは無いでしょうか。 あるいは、radian と degree がごちゃごちゃに混ざって変換を間違えてしまったりすることは……

……というときに、型に単位の情報まで含めてチェックできるようにしてしまおう!という、 テンプレートメタプログラミングの古典のようなテーマがありますが、 それをきっちり実装したのがこのライブラリです。デフォルトでは上記の例のように quantity 型は単位付き double 型になりますが、第二テンプレート引数で型を指定することで、 int や complex 型を使うことも可能です。

あと使用経験皆無なものの,Curl も単位をサポートしているとか.

数値に単位をつけられる

Curl では数量型という概念がある。これは、数値に単位系をくっつけたもの。これを使うと、コードがたいへん分かりやすくなる。

例えば「10kg」と書けば、重さを表す数量型になる。単なる「10」ではない、単位を伴った数量なのである。だから「10kg==10000g」は true であるし、「10kg==10m」は false である (そもそも異なる単位系の数量型を比較すると、コンパイル時にエラーとなる)。

また既存の数量型から、新しい数量型を定義することもできる。たとえば、Velocity は Distance を Time で割った数量型だという定義が可能で、54km / 3.0hr = 5.0m*s^-1 という値がそれになる。もちろん単位系まで考えてコンパイルエラーがでる。

Ruby on Rails では 1.hour とか 2.month とかできて大変便利だけど、それを知っている人なら Curl の数量型がいかに便利かわかるだろう。数量型はさらに Time や Date 以外の SI 単位系全般で使えて、かつ型システムと結びついているからすごい。

ここまでくると、静的な型があってよかったと誰もが思うだろう (Rubyist や PHPer でもそう思うはず)。数量型を知ると、C#Java のような型システムがいかに時代遅れかということを思い知らされる。

ただ,いかにも Web 用というか,現行の Curl の単位サポートは,(計算の中間結果も含めた次元の)値の範囲にかなり狭い制限があるみたい.人工衛星とか飛ばす場合には『例えば、Curl を避ける』と書いておいても良さそうではある.

Curl 言語のこのリリースでは、単位を -8 乗より小さくすることや、7 乗より大きくすることはできません。たとえば、5(m^12) または 5(m^-12) にすることはできません。計算の中間結果がこうした累乗を超えないように注意する必要があります。

更新履歴

  • 2010年2月2日
    • "(計算の中間結果も含めた次元の)" を追記.