[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00150] drand48




古川竜雄です。

古川> もしかして、OpenBSD 2.5 って int が 16 ビットなのでしょうか? (ま
古川> さかねえ…)

元木さん> Debian GNU/Linux でも gcc に -ansi をつけるとばっちり 
元木さん>  >warning: integer overflow in expression 
元木さん> が出ます。

元木さん> 式を見て考えたところ sizeof(int) == 4 な OS/ディストリビュー
元木さん> ションでは 1 << 31 すると signed int の範囲を越えるため警告
元木さん> が出ると想像できます。

なるほど! (しかし、ここまでたどりついていながら正解を見つけられないな
んて…)


なお、この部分のパッチは永江さんのもの(unsigned で定義する)を使わせて
頂きました。

ところが、[freewnn:00137] のにしくさんのレポートによれば OpenBSD でも 
drand48 があるではないですか! というわけで、FreeWnn のソースの

    #ifdef SRAND48
    #define RAND()  drand48()
    #else
    #define RAND()  ((double)rand() / (double)((1<<31) - 1))
    #endif

の判断がおかしいことがわかります。OpenBSD ならば上側の定義を使うべきで
す。

というわけで、configure で drand48 が存在するかどうかを調べ、その結果
ないと判断された時のみ下側を使うようにしました。また、下側のコードは 
rand() の最大値が ((1<<31) - 1)) であると仮定していますが、それはあま
りいいことではないと思うので RAND_MAX で割算するようにしました。
RAND_MAX がない時に ((1U<<31) - 1)) が使われます。

以上の修正を 1.1.1-a012 で行ないました。多分大丈夫と思いますがなにか問
題があれば教えて下さい。

-- 
古川竜雄 (frkwtto@osk3.3web.ne.jp) / FreeWnn Project