« いかなご | トップページ | 靴がない »

2010年がうるう年になってしまった?

PS3(新型 PS3を除く)に使用している時計機能が、2010年を“うるう年”と認識し、起動エラーが起きたというニュース。

どういう計算をしたら、2010年が閏年に勘違いされちゃうの? というのは、気になるところです。

単純に西暦が4で割り切れたら閏年 というルールを適用すれば、絶対、エラーは起きません。100で割り切れたら・・・ 400で割り切れたら・・・を使っても、2010年は閏年にはならないハズ。

じゃぁ、どういう計算をしたのかな? という話です。

ここでポイントなのが、PS3は組込システムだとゆーこと。

「組込の場合、閏年はビットをシフトさせて判定する」のだそうです。
・・・先生! 意味、判りません。詳しく説明してください。

4を二進数で表記すると100。ビットを2回シフトさせると1になる。ビットを戻すと100。元のデータと比較すると、同じ状態だから、4の倍数であることが判る。5の場合は、101 => 1 => 100 で、ビットが欠けたから4の倍数ではない。
ビットをシフトさせるのと、割り算では速度が10倍くらい違うから、組込では割り算は使わないのだそうです。
んで、うっかり、シフトを1回だけズラして判定しちゃうと下記表の通り10は元と同じ状態なので、閏年と判定されてしまったのではないか?

10進数 2進数 ビットを1回シフト 戻す 判定 2回シフト 戻す 判定
6 110 11 110 1 100
7 111 11 110 1 100
8 200 20 200 2 200
9 201 20 200 2 200
10 210 21 210 2 200

PS3が発売されたのは、2006年11月でした。もし、1月に発売されていたら発売直後にこのエラーは露見していたのではないか? というのがわが家の推測です。

« いかなご | トップページ | 靴がない »

020_おたわごと ?」カテゴリの記事

コメント

今回のバグは二進数と二進化十進数(BDC)の混在が
原因では?と思われます。

参考:二進化十進表現@Wikipedia
http://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E5%8C%96%E5%8D%81%E9%80%B2%E8%A1%A8%E7%8F%BE

二進化十進数では2010を
0010 0000 0001 0000
と表しますが、西暦4桁のうち下2桁を二進化十進数ではない
通常の二進数として変換すると16になります。
西暦4桁の上2桁を20固定として設定されていた場合
下2桁の0001 0000を二進化十進数で見るか二進数で見るかで
2010年になるか2016年になるかが変わってきます。

で、2016年は見事に閏年というわけで。。。(^_^;)

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/17907/47712032

この記事へのトラックバック一覧です: 2010年がうるう年になってしまった?:

« いかなご | トップページ | 靴がない »

2015年6月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

最近のトラックバック

無料ブログはココログ

ブログパーツ

  • なかのひと