2000年02月29日

400年に一度の閏年

今年は400年に一度の閏年であり、そして今日は400年に一度の閏日である。今日のニュースでもそのために起こったコンピュータの誤作動を大きく報じている。もしかしたら、4で割り切れる年は閏年に決まっているでしょ? という方もいるかもしれないがそれは間違いである。

以下のCのソースコードを見て欲しい。一目瞭然であるが、4で割り切れ、かつ、100で割り切れないか、400で割り切れる年が閏年である。このとき、4で割り切れ、100で割り切れない年を閏年としてしまったり、西暦を二桁で扱ったために1900年として計算が行われたりすると、プログラムは誤作動を起こすのである。

year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)

これも一種の2000年問題だが、閏年に関しては、閏年ではないのに閏年だと誤認する2100年問題の方が、トラブルは大きい気がする。もっとも100年後のお話であるけれど(笑)。

話はちょっと外れるが、以前、以下に示す日付から曜日を求めるプログラムを見て感動したことがある。因みにこれは、C言語のFAQにも載っている、坂本智彦さんという方が書かれたものだ。

dayofweek(y, m, d)      /* 0 = Sunday */
int y, m, d;            /* 1 <= m <= 12, y > 1752 or so */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

こういうソースコードと出会った日は、なんだか嬉しくなる。

Posted by Foota at 2000年02月29日 00:00
Comments