電卓の話

また、電卓など標準アプリケーションに入っているのも昔のまま。AppleのCMでクールなアプリケーション(笑)として挙げられているのをご存知の方も多いと思う。過去との互換性もあるので(別のアプリケーションから起動している可能性がある)変更が難しいのかも知れないが、どうせ変えるならとことんWindows Vista風にして欲しかった。


電卓
これも3.x以前から存在する標準アプリケーション。何1つ仕様は変わっていない

Windows史上初? 大きく変わった「電卓」

誰もが一度は使ったことがあるWindows付属アプリケーションの筆頭と言えば、やはり電卓だろう。ごく単純なメモリー機能付きの四則計算に使うのが一般的だろうが、2/8/10/16進数を扱う関数電卓にもなる。Windowsの電卓は「あって当たり前」の空気のような存在で、Windowsが手を変え品を変えて進化してきても、電卓だけはほとんど、機能も見た目も変わることなく、そのまま続いてきた。その電卓がなぜか、Windows 7では大幅にパワーアップしている。

Windows 95以来、スタートメニューのアクセサリには、電卓が含まれていた。その機能はVistaまでほとんど変わることなく続いてきた



When you change the insides, nobody notices - The Old New Thing』より.

14.20 中身を変えても誰も気付かない

電卓とメモ帳が変化していないことに人々が不満を漏らしたときはわけがわからなかった。実際には、どちらのプログラムも長年にわたって変化してきた(メモ帳にはメニューやステータスバーオプションが追加されたし、電卓には大掛かりな改修作業が行われた)。

これらの人々が、「なぜ Microsoft は Windows をかっこよく見せることに全力を注いでいるのか。技術の改善に全力を注ぐべきであり、外観をよくするための改良はやめるべきだ」と訴える人々と同じであったとしても、驚くにはあたらない。

そして電卓には、まさにそれが起きていた。大がかりな技術的改善である。外観は改善されていない。そして、そのことに誰も気付かなかった。それどころか、不満は続出した。「電卓を見てごらん、これまでとずっと同じじゃないか。」

電卓の内部(算術エンジン)は完全に最初から書き換えられていた。IEEE 準拠の浮動小数点ライブラリが任意の精度の算術ライブラリに置き換えられた。これは、電卓が小数の計算を正しく行えないことを小ばかにする記事が書き立てられたからだ(たとえば、「10.21 - 10.2」は 0.0100000000000016 になった)。

(中略)

好きか嫌いかはともかく、UI を変更しなければ誰も気付かない。新しい UI にあれほど労力を注いでいるのはこのためだ。



Windows 95 付属の電卓にすでに拡張精度機能が実装されていたとすれば,「Windows 95 以来ほとんど変わることなく」ってのはまあそこまで外れてはいないかもしれませんが,さすがに Windows 3.x 以前から何 1 つ仕様は変わっていないって言われるのはかわいそう.

単位の話

だいぶ前に書こうと思って書き忘れてたのを今頃書いてみたり.
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日
    • "(計算の中間結果も含めた次元の)" を追記.