kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

それでも10進小数をデフォルトにすることは意味がある

改めて(?)か昔からあるのか不明ですが、10進小数を言語のデフォルトにすべきかどうかという議論が一部で行われています。私自身、特にプログラミング教育を最近やっている立ち場もあって、10進小数を言語のデフォルトにすることに賛成の立ち場です。ただ、正直言ってこれに大して「反対する」側は何が焦点になっているかについて「ずれている」と思わざるをえないです。まずは、直近で見かけたWindyMeltさんのブログ記事より。

blog.3qe.us

ちなみにこれはCOBOLかそうではないか、という軸が問題になっているのではなく、浮動小数点型を利用するか、それともBigDecimalのような十進演算のために用意された型を利用するか、という軸の問題であって、しかもそれも正確な軸の取りかたではない。

というのも、BigDecimalでカバーされない問題があるのだ。例えば、BigDecimal型を利用しても(1 / 3) * 3の結果はすぐ壊れる。

こんな話は10進小数派も基本的には問題にしていないわけです。重要なのは金融系だけでなく特に実世界の商慣習を扱う分野では基本的に10進小数でものごとを取り扱っているわけで、ここで2進小数を使うのは基本的にありえないということです。だから、数多の書籍やWebページなどでは「金銭などを扱う場合はdecimalやBigDecimalを使いましょう」という注意書きが本当にくどいほど書かれています。

そんな注意書きをくどいくらいにしなければいけないなら、もうデフォルトを逆転させてしまって、小数のデフォルトは10進小数にしてしまえばいいじゃんって話が重要な論点のはずです。ついでにいうなら「2進小数をなくしてしまえ」なんて乱暴な主張をしている人は見たことがありませんから(ごく少数いるかもしれませんが、多数派ではないでしょう)、それを前提にしたような主張をするなら相手の論点を正しく読めていないだろうと判断します。

もちろん、2進小数の方が適切な場面は科学技術計算をはじめ数多く存在しています。ただ、別にデフォルトが10進小数になったとしても、2進小数をメインで扱いたい人はそこまで不便にはならず、表記が多少冗長になるくらいで済むだろうと思います。ぱっと思いつく表記だと

BDouble x = 0.1bd ; // BDoubleは2進浮動小数点数(64ビット)を扱うものとする

とでもすればよくて、こういう設計で2進浮動小数点数を使いたい人が困るとも思えません。さらに、2進小数を使いこなせる人はより深い理解を持っている側ですが、そうじゃない人の方が最近は多いです。それでいて、10進小数で物事を主に処理する必要がある業務アプリケーションの需要は増え続けているわけで、罠にハマる人を減らしたいというのは正当な動機だと思います。

10進小数だろうが誤差は生じますが、高校までの学校教育で「習った」ことの延長線でとらえられるので、2進小数の罠を回避するよりはずっと容易と考えられます(高校物理でも高校数学でも誤差の話はでてきますよね)。

別の観点ですが、Scratchを使ったプログラミング教育(特に子どもを対象にした)に詳しい阿部先生も

このようなことを書いておられるわけで、言語のデフォルトが2進小数なせいでつまづく人が「大勢いる」のは間違いないと感じます。

教育の面から「10進小数デフォルト論」がでてきているのにその文脈を理解しようとしないのは悲しいことだと改めて言っておきたいです。