32-浮動小数点数は実数ではない

プログラマが知るべき97のこと」の32個目のエピソードは、浮動小数点数に関する話です。プログラムにおける整数や実数に関しては、数学的な整数と実数と異なる性質を持つため、適切な理解が必要と述べられています。非常に基礎的な話な筈ですが、開発現場では全く知らない人も珍しくないというのが現実かもしれません。
エピソード内では浮動小数点数について実数とは異なるものという事が説明されています。浮動小数点数を学ぶ時には必ず桁落ちもセットで学びますが、数学的な説明はされないことも多いようです*1。本文にも書かれていますが、実数とは連続した数である必要があります。しかし、コンピュータ上で実数を表すことは原則としてできません。それはデータ構造がビット構造である以上、集合が有限になるという制約が課せられるからです。細かい部分や最新の研究などには明るくありませんが、擬似的に連続した実数的なクラスは表現可能でしょう。しかし、少なくとも浮動小数点数は実数ではありません。
ありがちな話で、誰もが聞いたことがあるトラブルは「金融系における浮動小数点数による演算」です。正直な所、自分にも「そんな酷い話はあるわけがない」と思っていた時期がありました。・・・が、ある時期に参画していた金融系のアプリケーション*2で、まさにそんな悪夢がコーディングされており、担当していた協力会社*3ごと信じられなくなった思い出があります。そのシステムはウェブアプリケーションでしたが、当然のように問題はそれだけではなく、ある処理の中で巨大な配列(試算で400MB程度)を生成する処理があり、同時リクエストが行われるとシステムが落ちるというバグも抱えていました。これも「配列を初期化するとメモリが確保される」という本当に基本的な事すら知らない人がコードを書いたのが原因でしょう。そんな人達はきのこ本や技術系Blogなど読む事はありませんし、これを読んでいる人には釈迦に説法だと思います。もし、そんな惨状を経験がないプログラマがいれば幸せではないでしょうか。
このように基礎的な情報処理の知識はプログラマとして必要な教養です。フローチャートの書き方は不要かもしれませんが、プログラムが原則としてフロー制御である事は知っておくべきです。文字コードの変換を実装できなくとも、どのような技術と経緯があるかは知っておくべきでしょう。業務ロジックを書けば仕事にはなりますが、ウェブアプリケーションを開発する人であればHTTPの基礎知識は知っておくべきです。近年はプログラミング言語フレームワークも高度になってきており、ローレベルの技術について知る必要がどんどんとなくなってきています。だからこそ、少なくとも自分の使っている技術のすぐ下のレイヤーまでの基礎知識は重要になってきます。
基礎知識の学習はスポーツ選手で言えば体力作りに相当すると思います。「プログラマが知るべき97のこと」としてはその体力作りも重要であるという点ではないでしょうか?そして、場末の開発現場ではプロ選手として全く基礎トレーニングを行っていない選手を試合に出すことも珍しくないことを心にとめておきましょう。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

*1:未経験者OKの弊害です

*2:勘定系ではなくサブシステムではあった

*3:2chでも有名な派遣系の会社でした