2010年を閏年と判定してしまう計算はどうやっていたのか興味があります。
- 閏年は4で割り切れる年で且つ100で割り切れない年
- 100で割り切れる年は閏年ではない。但し400で割り切れる年は閏年
です(よね?)。上記ルールをそのままプログラムで書くと以下のようになるでしょう。
if((year % 4) == 0) {
if((year % 100) == 0) {
if((year % 400) == 0) {
return true;
}
return false;
}
return true;
}
return false;
最初に思い浮かんだのが1970年を起点として
(年数-1970)%4
で計算しているというものです。これだと(2010-1970)%4=0で閏年と判定されてしまいそうですが、PS3の販売は2006年なので2008年の閏年で判定ミスが出なかったことがおかしいです。
そこで次に考えたのが100を10と間違えてしまったプログラムです。単なるケアレスミスですが、コンパイルエラーになるわけでもないしテストしていなければ気付かないという可能性はあります。
しかし、10と100を間違えたところで100で割り切れて400で割り切れない年は閏年ではないので2010年を閏年と判定することは無いと思います。
そこで更に考えたのが100を10と間違えて且つ判定を勘違いしていた。つまり100(10)で割り切れていても閏年と判定してしまっていたのではないか?ということです。上記コードの赤字になっている部分2箇所を間違えてしまっていたんじゃないかなー?
というのが僕の想像したPS3閏年判定ミスです。
幾らなんでも違うだろうな…^^;
考えていたときに書いた閏年判定ショートコーディング。
return !(year%400)||(year%100)&&!(year%4); // 正常版
return !(year%400)||!(year%10)||!(year%4); // 想像したPS3版