生年月日から年齢を計算する簡単な方法
生年月日から年齢を計算する簡単な計算式という内容のブログがあった。
単純に
(今日の日付-誕生日)/10000の小数点以下切捨て。
ふーん、で終わったら、技術者が泣く。
どうして答えが出るのか確かめたいじゃないか!ということで、
単純に現在の西暦ー生年月日の西暦、で大体の年齢は出る。
まあ誤差1歳以下で、
面白いなーと思ったのは
西暦(yyyy)は10進法、
月(mm)は2桁使って12進法
日(dd)は2桁使って約30進法が混在しているのに
普通に10進法で処理してまあまあ正しい答えがでるところだ。
直感的には各項目を10000 で割って計算するとわかりやすい。
例えば某氏の年齢は
2007.0827 - 1965.0510
42.0317
ああ、だいたい42歳くらいちょっと。とわかる。
本文では小数点以下は省略とあったが、結構直感的に小数点以下も使えるのではないか?と計算してみた。
プログラム書いてみた
#!/usr/local/bin/perl@days=('dummy','31','28','31','30','31','30','31','31','30','31','30','31');
$max=1231;
$min=101;
$range = 1130;
$before=101;
$cnt=1;
for ($i=1;$i<13;$i++){
for ($j=1;$j<=$days[$i];$j++){
$num= sprintf("%02d%02d",$i,$j);
$per = (($num-$min)/$range)*1000;
$xy = (($cnt++)/365)*1000;
print "$num , $per , $xy\n";
$before = $per;
}
}
これで出力される数字をCSVにしてエクセルに食わせる。
何がしたいのかをいうと、
小数点以下の4桁の10進数は
4桁の365進数とどのくらい誤差があるか?である。
つまりですよ。
30進数を使っている限り1月最後から2月の頭は0131から0201になるので70も進むのだ。
毎日1つづつ進んでいるのに月替わりには2ヶ月も進んでしまうことになる一体これをどう吸収しているのか?
ってことが気になるじゃないですか!
え?俺だけ?
じゃじゃーん。ピンクが論理値。ブルーがこの裏技計算方法の数字。
X軸は1年の日数(365日)、Y軸は10倍した理論値(100%=1000)
毎月ジャンプしている姿がよくわかる。
毎日は徐々に増えているが理論値には及ばないので月替わりでジャンプしているという感じになっている。
だからなんだ!!
つまり、、、感覚的に直感では2ヶ月以上の差がある、ということだ。
追加で限界テスト結果。
2007.0228-2000.0229
6.9999
ええー、7歳じゃないの??
大丈夫らしい。でも誕生日ケーキは28日に食うよね?
ついでに平成生まれアイドルとかいうあたりも
日本の法律を確認してみました。誕生日の前日が終了する瞬間(すなわち誕生日をむかえる午前0時00分の直前)に1歳を加えることになる。ただしうるう年など、年によって期間を定めた場合において最後の月に応当する日がないときは、その月の末日をもってその年齢が満了する、
昭和64年1月は7日しかないので、、2月1日が1歳なのか?とか興味はつきないが、、まあいいや!
1月1日より始まって、12月31日にゴールするのだが
ちょうど真ん中でクロスしているのがわかる。
こうやってグラフ化するとおもしろいね。
え!?面白くないですか????
コメント
ご免なさい。読むのに拒否反応が・・・(^^;) 数学は赤点でした♪
投稿者: omike | 2007年08月27日
>omikeさま
数学的なことというよりか頭の体操ぽっぽいですね。
逆に私は文学とか社会、歴史は苦手です。
投稿者: ふな | 2007年08月27日