やじゅ@アプリケーション・ラボ わんくま支局

目次

Blog 利用状況

ニュース

プロフィール

MSMVP

2010年3月4日 #

PS3の閏年問題の原因

3/1日に発生したPS3の障害について、ソニーから公表されている原因として、
「旧型PS3の時計機能が2010年を「うるう年」と誤認識していたため」です。

でも、何故2010年を閏年として誤認識したかまでは公表されないので推測
するしかありません。ネットでいろいろ説が出ているなかで、納得しやすいのが
BCD(2進化10進法)の変換ミスだと思われます。

以前、2010年問題(笑) という記事を書いたのですが、このPS3の不具合があり
トラックバックとコメントが書き込まれました。少しは役は立ったようです。

その時に、kazさんから頂いたコメント
「いわゆるRTC(リアルタイムクロック)のICチップは、日付・時刻の表現をBCDで
返す物があります。 また、西暦は桁数が多くなるため下2桁のみ保持し、上2桁
の桁上がりが発生した場合は、桁上がりビットで通知する実装が多いです。
これは現行のRTCでも主流の実装です。 つまり、2000+BCDの2桁を16進と
見なした演算というミスが入り込む余地があるのです。 」

では、BCD(2進化10進法)とは何かというと、1バイト(8Bit)を上位4bitと下位4bitで
それぞれ0~9で表現し、0~99の数値を扱います。
通常の2進法と違い10になった場合、上位4bitに桁が上がります。


2010年の下2桁10はBCDでは、「0001 0000」です、これは通常の2進法では
16と同じ表現になります。
実装を誤って、2010年→2016年として閏年チェックした場合、2016年は4で割り
切れるため、閏年として判断されます。

この説では2年後の2012年は、閏年なのに閏年では無い(2018年)と逆に判断されます。
また、4年後の2014年は、2020年となるため今回と同様になります。


参考:
ソニー、ウォークマンAのワンセグ“うるう年問題”を改善
http://av.watch.impress.co.jp/docs/20080422/sony2.htm
マイクロソフト Zune 30GBに閏年バグ
http://japanese.engadget.com/2008/12/31/zune-30gb-12-31/

PS3のうるう年誤判定を推測してみる
http://maoku.at.webry.info/201003/article_1.html
PS3 Linuxでioctl()を使ってRTCにアクセス
http://twitter.com/gtk/status/9867069006
RTCとBCDに注目
http://slashdot.jp/~Qs/journal/501706
サービス側の判定について
http://d.hatena.ne.jp/wapa/20100302/1267469183


追記:
PS3の閏年、2010年2月29日。または2030年2月29日。
http://d.hatena.ne.jp/sci/20100303
offset値を1970→1980としたミス 2010年を2000年で扱われ100で割り切れた説
http://joel.dreamwidth.org/1917.html
http://aopen.jp/tech/techinside/y2k.html
if ((year += 1900) < 1970) year += 100;

posted @ 1:53 | Feedback (684)