本日は2月29日(木)。
4年に一度しか巡ってこない
うるうどし
閏年
なので、この話題を。
ちなみにご存じの通り
閏年は4年に1回
西暦が4で割り切れる年の2月に
一日付け足して2月29日とする
決まりではあるが、実は例外がある。
西暦が100で割り切れる場合には
閏年としない
さらには
西暦が400で割り切れる場合には
必ず閏年とする
のであった。
整理すると
1)西暦年が4で割り切れる年は(原則として)閏年。2)ただし、西暦年が100で割り切れる年は(原則として)平年。3)ただし、西暦年が400で割り切れる年は必ず閏年。
である。
こんな3番目の規則なんて
生きてるうちには巡って来んワイ
などと思っているかもしれないが
実はつい最近巡ってきている。
そう、2000年にww
↑
2000年をつい最近と豪語する昭和世代
まぁ、2番目の規則にしても
次ぶち当たるのは76年後だww
コンピュータを扱っていると
プログラムの中で
日付の計算などを行う
ことがしばしばあるが
この規則を無視すると
日付が合わなくなってしまう。
日付を遡ったりする際に
10,000日前は何月何日何曜日?
などと計算すると
1年を単純に365日として考えてしまう場合と
上記の閏年を勘案する場合とでは
結果が異なってしまうのであった。
2000年を迎えるに当たっては
当時は
【2000年問題】
などと銘打って
大々的に社会問題として取り上げられていたが
実はこの問題と閏年は
さして関係がない。
【2000年問題】の本質は別である。
実はムカシのコンピュータでは
メモリーやディスクの価格がとても高く
つまりデータとしての
1ビット単価
が現在とはお話にならないくらい高かったのである。
そのため、IF文での条件分岐で
「YES」とか「NO」とかの文字列を使うと
それだけで3バイト(3文字×8ビット=24ビット)
も浪費してしまうが
「1」か「0」かのビットで表せば
1ビットでコト足りる。
同じように日付についても20世紀中は
1900年代であれば
必ず上二桁は「19」
なので
それを省略して
1992年4月1日
などを
"920401"
などと表して格納していたのだ。
20世紀中にはこれで
年号の足し算引き算も問題なかったのであるが
2000年になった途端
2000年1月1日
と
1999年12日31日
の差は?
などと計算する場合
「00/01/01 - 99/12/31」
と、答えが負の数字になったりして
誤動作してしまうのであった。
これを古いプログラムでは
「そんな、このプログラムが21世紀まで使われるものか」
と考えたか考えなかったかは定かではないが
想定したプログラムにはなっていない場合があったのだ。
大規模なシステムになると
何千本何万本というプログラムがあり
それをひとつひとつ見直して修正する
という気の遠くなるような作業が必要で
それがゆえに
【2000年問題】
として大問題になっていたのである。
これは、1999年を「99」としていたものを
「1999」とプログラム上書き換えるだけではダメで、
格納されているデータも桁数を増やすなど
の対策が必要だが今度は
データの桁数を変えると
そのデータを参照している
すべてのプログラムに影響するのであった。
そのため、暫定対処として
「年が"00"から"60"までだったら"20xx"と解釈し
"61"から"99"までだったら"19xx"と解釈する」
などという手を打って済ませた場合もあると聞いている。
しかし、よく考えればわかるが
これは結論を先延ばししただけで
今度は"2061"年を超えると誤動作するという
新たな時限爆弾を仕掛けているのであった。
「そんなに長く同じプログラムを使うものか」
(。-∀-)
というのは、2000年問題の時と
まったく同じ理屈である。
しかも、プログラムごとに
こっちでは50年を区切りに
こっちでは60年を区切りに
などといったテキトーなことをしていると
まったく予測しない忘れた頃にエラーを起こす
ということが起こりかねないのであった。
これが
【2000年問題】
の本質である。
いやー、2000年問題など
聞いたこともないという年齢層や
そもそもコンピュータに興味のない方には
どーでもいい
(わけじゃないがww)
話題だな。
もっとも現代のプログラムでは
このような日付を扱う時には
事前に準備されている
関数
を使うことが一般的で
エンドユーザがプログラムでシコシコと
日数計算をする場などは少ない。
だがしかし、その提供されている
関数
がそもそもバグっていては
意味がないがなww
あと、閏年関連の話題として。
2月29日生まれの方は
4年に1回しかトシを取らないのか問題。
実は、年齢を重ねる場合
いつがそのタイミングなのかというと
誕生日を迎える前日の24時
だと規定されているのである。
そのため、2月29日生まれの方は
2月28日24時00分
にトシを重ねるので
4年に1回しかトシを取らない
ということはないのであった。
そして、この同じ理屈により
4月1日生まれの方は
前年の学年に編入される
のであった。
そう。トシを取るのは
3月31日24時00分
だからな。
つまり4月1日生まれの方は
ホントなら翌学年になりそうなところ
前学年の最後のお誕生日
ということになるのであった。
そんな
4年に1回しか話題にできないからといって
トンデモ冗長なマクラはさておき。