作者: davi
日時: 2009/2/11(18:52)
みなさん  <  こん??は でび@浅田彰の逃げて逃げて逃げまくれ、を実践中。です

以下、TSabcでの、ねこ丸さんの、古いテキスト類って結構大事だよ
っていうお話の流れで、やってみて、出てきたネタです。

河野真治著『入門Perl』(アスキー 1994/7)
http://www.amazon.co.jp/dp/4756102921を引っ張り出してきました。

# この本、最後のお題が9600bpsのモデムでパソ通のBBSへの
# ソケットを張る通信マクロ作成なんですよぉ。
# 良い風合いに骨董化している、という訳で引っ張り出してきました。

なお、ぶっちゃけ、「ひでーな、この本。教える内容の順番が
グチャグチャ。」が感想です。放り投げていたのもそれが理由の一つかも。

さて、5.8系でPerl最新版入れてみて、ヘノンアトラクタ(エノン写像)
の行列を1万行生成し、出力をExcelに貼り付けて散布図でプロット
してみました。

# -----------------------
$x = 0.2;
$y = 0.3;
for ($i=0;$i<10000;$i++){
    printf("%1.3g\t%1.3g\n" ,$x,$y);
    ($x,$y) = (1.0+$y-1.4*$x*$x, 0.3*$x);
}
# -----------------------

う〜む。ちゃんと出た。

Active Perl v5.8.9 build 825 [288577]
0.2 0.3
1.24 0.06
-1.11 0.373
-0.341 -0.332
0.505 -0.102
0.54 0.152
0.743 0.162
0.39 0.223
1.01 0.117
-0.312 0.303

式そのものは簡単なので、ついでにExcelで同様の式を作成して
やってみました。
x          y
0.2         0.3
=1+B2-1.4*A2^2   =0.3*A2
以下、オートフィル。

出てきた結果は以下の通り。

Excel 2007
x y
0.2 0.3
1.244 0.06
-1.107 0.3732
-0.341 -0.33196512
0.505 -0.102310591
0.540 0.151562331
0.743 0.162108168
0.390 0.222833095
1.010 0.11691104
-0.312 0.303065036

これ、よく見ると、数値行列の値が結構違いますね…。

Excelのxの3つ目の出力 -1.107 に注目すると、
小数点第3位の四捨五入とか、切り上げ/切り捨て
などの処理では他の値に影響が出てしまいそう。

つまり、Excel側で通常の操作では、対応不可能っぽい気が…。

いろいろ調べてみたら、浮動小数点の誤差ってことみたい
なんですが、その理解でOK? > おる

浮動小数点の誤差について、Excel側の出力を、Perlと同じ
結果に持ってゆくのはマクロ組むとかで切り抜けるとか、
結構めんどくさそう。
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml

つーか、Perlが採用している浮動小数点のデータ形式も
よくわからんし。

# 上のスクリプトの、3gは浮動小数点を有効桁3桁に四捨五入で
# 丸めろ、という指定ですよね?

しかし、こんなに違うと、衛星射出の軌跡計算とか医療分野とかで
Excelを使うのは危ないかも、って、ちと怖くなってきますな…。

# 昔、CPUにはコプロセッサあり/なしバージョンがありましたね。
# Intel386 SXの方が安いとか…。

でび  http://davi.txt-nifty.com/1984/