Я использую реализацию Mersenne Twister, которая предоставляет мне числа с двойной точностью.
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/FORTRAN/fortran.html (реализация на Fortran 77 от Tsuyoshi Tada, я использую genrand_real2)
Однако моему приложению необходимо, чтобы избежать предупреждений при умножении чисел с разной точностью, случайное число с одинарной точностью. Итак, я написал небольшую функцию для преобразования между двумя типами данных:
function genrand_real()
real genrand_real
real*8 genrand_real2
genrand_real = real(genrand_real2())
return
end
Я использую real и real*8, чтобы соответствовать коду, над которым я работаю. Он отлично работает большую часть времени (помимо факта, что я не уверен в том, насколько быстро работает real()), однако он меняет верхнюю границу моего ГСЧ, поскольку преобразование изменяет [0,1) на [0, 1]. Я никогда не думал об этом, пока у меня не возникли проблемы с этим.
Мой вопрос в том, как я могу эффективно обеспечить верхнюю границу или даже как я могу написать функцию, аналогичную genrand_real2 (оригинальной), которая предоставляет мне реалы с одинарной точностью. Я предполагаю, что мне нужно заменить только делитель 4294967296.d0, но я не знаю, на какое число
function genrand_real2()
double precision genrand_real2,r
integer genrand_int32
r=dble(genrand_int32())
if(r.lt.0.d0)r=r+2.d0**32
genrand_real2=r/4294967296.d0
return
end