新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: Re: キャンセルコードの文字化け
Date: 1998/08/14 02:01:43
Reference: mesh.forum.3/00526

8月13日に、kiyoさんは書きました。

>>まともに動いていれば、
>>
>>  0.000149,  0, 'A'
>> 13.360622, 13, 'N'
>>
>>の様な感じになります。
>
>私も同じような現象で悩まされています。
>こちらの環境
>OS:SunOS5.4
>perl:perl4
>では次のようになります。
>原因がわかりましたら教えてください。
>
>  9.795227,  9, 'J'      
>875601.725464, 875601, ''
>
あたしの書いた例は、SunOS4.1.4-JLでの実行結果ですが、kiyoさんの結果と比較すると

     9.795227 / 65536 =  0.000149
875601.725464 / 65536 = 13.360622

であることが分かりますね。ここで、65536=2^16です。
さて、これは何を意味しているのでしょうか?

perlのrand(n)関数は、出力をn未満の数に制限するのですが、通常のC関数のrand()は
出力を0から2^N-1の整数で返します。perlのrand()の中では、この整数出力をn未満の数に
変換しているのですが、当然、最大ビット数のNを知っている必要があります。

この最大ビット数はperlをコンパイルする時に設定するのですが、SunOSの様に
N=31のrand()を持つ環境で、誤ってN=15を設定してしまうと、上記のように
perlのrand(n)の結果が2^(31-15)=2^16だけ狂ってしまうことになります。

と言うことでお分かりでしょうか? つまり、perlのコンパイル時の設定が間違っているので、
再コンパイルが必要である、と言うことです。(^^;;