も最小限の標準的な使用式乱数発生器内のオーバーフローと4バイトの対8バイト整数
x(i+1)=16807*x(i) mod (2^31-1)
として知られている有名な線形合同乱数ジェネレータ私はこの使用のFortranを実装したいです。
しかし、「数値レシピ」で指摘されているように、デフォルトの整数型(32ビット)の式を直接実装すると16807*x(i)
がオーバーフローします。
したがって、Schrageのアルゴリズムは、mの近似分解に基づいています。このメソッドは、デフォルトの整数型で実装できます。
しかし、私は、Fortranが実際にその範囲16807*x(i)
は可能性よりもはるかに大きいです9,223,372,036,854,775,807
から-9,223,372,036,854,775,808
あるInteger(8)
タイプを持っている疑問に思って。
しかし本も次の文
式(7.1.2)を実装することは不可能であり、前記(7.1.3)高級言語で直接 、Aの生成以来m - 1は、32ビット整数の最大値の を超えています。
なぜ、Integer(8)
タイプを直接使用して式を直接実装できないのですか?
'整数(8)は8バイト整数ではなく、8種の整数を意味します。同じではありません。http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs- integerkind-4 –
数字レシピについては、http://www.uwyo.edu/buerkle/misc/wnotnr.htmlを参照してください。単にこれを信じてはいけません。それは古い本ですが、書かれていてもそれほど良いものではありませんでした。 –