No.38 2000/02/29
2000年2月29日問題

 2000年1月1日に続く2000年問題の危険日として、2月29日が指摘されていました。実際、2000年を閏年として扱っていないプログラムの誤動作が今日(2月29日)生じた事例があったようです。
 私が読んだ新聞では、現在使われているグレゴリオ暦での閏年の規則がこう説明されていました(一字一句そのままコピーしたものではありません)。
 4で割り切れる年は閏年である。
 ただし、100で割り切れる年は閏年ではない。
 ただし、400で割り切れる年は例外的に閏年である。
 驚いたことに、その新聞記事によると、コンピュータプログラマーにもこの規則を知らなかった人がいたそうです。
 上記の説明は、おそらく、閏年かどうかを判定するプログラム論理をそのまま人間の言葉に直したものではないかと思われます。そのプログラム論理とは、以下のとおりです。
 まず、フラグ「閏年」をオフにせよ。
 次に、データ「年」が4で割り切れるならば、フラグ「閏年」をオンに変えよ。
 次に、データ「年」が100で割り切れるならば、フラグ「閏年」をオフに変えよ。
 次に、データ「年」が400で割り切れるならば、フラグ「閏年」をオンに変えよ。
 (ここまで順に実行した結果、フラグ「閏年」がオンならばその年は閏年であり、オフならば平年である。)
 ここで「フラグ」(flag:旗)とは、コンピュータプログラム用語で、「そうである」か「そうでない」かを識別するためのデータです。コンピュータは、プログラムに真っ正直に従って、何度でも旗を上げたり下げたりします。「上げるのか下げるのか、いったいどっちなんだよ!」と文句を言ったりはしません。プログラムを作ったことがある人でないと上記のプログラム論理はわかりにくいかもしれませんが、旗を何度上げ下げしようとも、正しい結果が得られればよいのです。このようなプログラムテクニックはよく使われます。
 さて、このプログラム論理を人間の言葉に置き換えたものと推測される説明をもう一度見てみましょう。
 4で割り切れる年は閏年である。
 ただし、100で割り切れる年は閏年ではない。
 ただし、400で割り切れる年は例外的に閏年である。
 ただし書きが2回続いています。真っ正直に旗を何度でも上げ下げするコンピュータとは違って、人間にとっては、論理が2回反転する説明はわかりにくいのではないでしょうか。1回目のただし書きまでしか把握していなかった人が、2000年を平年として扱うプログラムを作ってしまったのではないでしょうか。ただし書きをまったく知らなかった人が作ったプログラムの方が、2099年までまともに使えるのですから、まだましだったのです。
 私は閏年の規則をどのような言葉で理解していたかというと、次のとおりです。
 4で割り切れる年は閏年である。
 ただし、400年に3回、100で割り切れるが400では割り切れない年は例外的に平年である。
 言っていることは同じなのですが、文章の上では論理が1回しか反転していないので、この方がわかりやすいと私は感じます。いかがでしょうか。
 私の理解では、2000年は「例外的な閏年」ではなく、「閏年から除外されない年」にすぎないのです。ですから、2000年を平年だと間違えている人がいるというのを、当初は信じられませんでした。

 論理の反転を使わない説明方法もあります。
 4で割り切れて、かつ100で割り切れないか、または400で割り切れるならば、閏年である。
 旗の上げ下げによらないプログラム論理でこのように書く方法もあるのですが、これまた、プログラムを作ったことがあるか論理学を学んだことがある人でないとわかりにくいと思います。やはり私は、まず原則を説明し、例外を1回だけ説明するのが、人間にとって最もわかりやすいと思います。

 私は、閏年の規則の説明文が悪かったことが2000年2月29日問題の原因になったと思っているわけではありません。しかし、新聞記事での説明文を読んだのがきっかけで、コンピュータプログラムのために都合の良い論理と、人間にとってわかりやすい論理とは適切に使い分けるべきだろうと思ったしだいであります。

 ところで、私の腕時計の日付表示が3月1日になっている。これも2000年2月29日問題か?…そりゃあ「4年に一度手動で合わせてね」という仕様だっちゅうの。

目次 ホーム