不動小数点数

ふふふ

「浮動」。五反田の近くに「不動寺」があって、東急には「不動前駅」があり、不動明王が…。

例によって What’s old Python 2.x な翻訳作業で「PEP 327: Decimal Data Type」に着手しはじめて、ふと何度でも間違えるこの誤字をやらかしてないか不安になってきて。あー、よかった、やってない。

で、その「動小数点数」の話でちょっと思い出した話があって。要はこの話なんだけど、これまで仕事してきた中で、「IT 業界人に不可欠であって欲しい数学」でずっと思うところがあってなぁ。

一つは「集合論」、なのね。中学レベルで十分なんだけれども、この素養が欠けてるエンジニアと会話するともう、イライラしてしょーがないのね。ベン図も理解出来ないエンジニアはとんでもないテストを書く。組み合わせ爆発になることも考えずに「これを全てテストしてください」とありえない指示を出す。あのさそれ組み合わせると何億にもなるんすけどどーしてくれんだバカたれが、てなことが頻発する。まともなエンジニアなら「学生時代苦手にしてたとしても」その重要性に気付いてちゃんと学習するんだけど、そうしないエンジニアも結構いて…、というよりは、割合としてはそうしないエンジニアの方が多かったね、ワタシの周りでは。

もうひとつが「計算精度」の概念なのよ。これもとんでもない輩が多くて、「小数点以下いくつ持ってますか?」で正確さを測ろうとする。おぃおぃ、「何海里」オーダーの要求精度をメートルで保持するのに小数点もクソもあるかい。それ、何センチのオーダーやぞ、航空機が 10 cm 動いたからどうだって言うんだ、しかも 10 cm なんか観測精度よりずっと小せーぞ、的なね。正確さと小数点以下、は、あんまし関係ない。

64 ビットの IEEE 754 では仮数部は 52 ビットある。これは 10 進の桁数で 16 桁ある。これで考えてみるとどういうことかと言えば、例えば興味の単位が「光年」だとして、「1.00000000000001 光年」みたいな表現みたいなことは可能だ、ってこと(厳密にやってないので一桁くらい間違ってそうだけど間違ってたらすまん)。「光年」という興味の単位の「周り」で「一番大きい位」と「一番小さい位」が何桁分あるか、というのが「有効精度」な。つまりは「精度≒小数点以下何桁」はこの意味ではもちろん真であるし、その意味で浮動小数点数(64ビット)は「小数点以下15桁も持てる/しか持てない」と考えるのは、「正しいことは正しい」。

問題はここから。「それ、食べれんの?」。なぜかここから先が脳内からがっぽり抜けてしまうおバカさんが多いのだ。その「小数点以下15桁目は価値があるのかな?」。というか最初の例のとおりで、「順序が逆」なのだ。「有効精度として必要なのはこうなので (最小単位 LSB で表現して何桁表現するか)」と考えなければならないのに、「小数点以下何桁」から思考を開始するので無意味な議論を始めてしまうのである。

「最小単位 LSB で表現して何桁表現するか」という言い回しは難しいかもしれないが、日常生活に結び付けて考えれば簡単である。「宇宙旅行権利を買う」のに 1 円玉何枚必要か考えるバカはいないし、スーパーで卵をひとパック買うのに金塊何グラム必要か考えるのもバカである。実際「小数点以下何桁必要?」という思考はこれと同じことをしている。要するに「最小単位」が先。「小数点以下」はその後。「小数点を移動することで興味の中心をシフトする」のが浮動小数点数の基本的な考え方で、「1円玉」で数えるか「1万円札」で数えるかにこれは相当する。

一つ前の話にもこれはあって、これ:

:class:`Decimal` numbers can be used with the :mod:`math` and :mod:`cmath` modules, but note that they’ll be immediately converted to floating-point numbers before the operation is performed, resulting in a possible loss of precision and accuracy.

「おっさるとおりではあるんだけどさ」、と思うわけだ。確かにこれは問題は問題なんだけれども、「問題じゃないのに大問題に感じる輩」がいそうで怖ろしいんだわ。ちょっと前の「color が 2 度登場するなんて、転職だ!」にも通ずるんだけど、本来 Decimal を適用しなければならないニーズもないのに使って大騒ぎする、なんて状況はいっくらでも目に浮かぶわ。なんでこんなことが起こるかと言えばそう、「正確さって何、精度って何、誤差って何」を考える習慣がないからなのな。「必要な正確性」に定義が必要なんよ。そうしないからオーバキルなことをじゃんじゃんばりばりやって「俺って完璧主義」と悦に入る「自称エンジニア」が増える。ちょっとばかりの教育、ってやつを、ちょっとのコストをかけてやるべきなんだと思うよ、企業やチームは。

分野によって必要な数学は違うし、場合によっては全く数学が必要ないものも確かにある。けど、「どうしても欠かせない数学を挙げるとしたら?」と問われれば、ワタシはこの2つを挙げる。

これらの素養がないことでの被害が大き過ぎるから。しかも周りに少しずつ神経衰弱と生産性低下をもたらすだけで目立たないのも問題。自分自身で気付いて改善出来る見込みもほとんどないし。そしてもっと問題なのが、指摘されても直せないこと。考えてみれば当然かもなぁ。集合論の素養って簡単に言うけどそれって「論理的思考」そのものだから。「思考そのものが出来ない」に等しいのかも。あと考えてみれば「精度の話」も、こういうのがわからない人の特徴って、「アナロジーが苦手」な人ばかりだった気がする。目の前の「数学とかロジック」と実世界とのマッピングが出来ないのね、こういう人たちって。