Random 包ranlib.f中的子例程ignpoi已损坏
我在linux上使用gfortran:GNU Fortran(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4 我正试图在此源代码()中使用Random 包ranlib.f中的子例程ignpoi已损坏,random,fortran,gfortran,numerical-methods,Random,Fortran,Gfortran,Numerical Methods,我在linux上使用gfortran:GNU Fortran(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4 我正试图在此源代码()中使用ranlib.f中的ignpoi 我使用 gfortran -O2 -c *.f ar cr libranlib.a *.o 当我编写简单的程序来测试ignpoi(泊松偏差发生器)时 如果平均值相同,则在一次或多次偏离后,会出现分段错误 12 7 Program received
ranlib.f
中的ignpoi
我使用
gfortran -O2 -c *.f
ar cr libranlib.a *.o
当我编写简单的程序来测试ignpoi(泊松偏差发生器)时
如果平均值相同,则在一次或多次偏离后,会出现分段错误
12
7
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7F077F1D3E48
#1 0x7F077F1D2FD0
#2 0x7F077E9042EF
#3 0x401288 in ignpoi_
#4 0x400A3D in MAIN__ at test.f:?
Segmentation fault (core dumped)
我就是这样编译测试的,没有编译错误
gfortran test.f libranlib.a
奇怪的是,每次我问不同的号码时,都没有问题。当我评论第104-105行时
IF (mu.EQ.muprev) GO TO 10
IF (mu.LT.10.0) GO TO 120
对于ignpoi.f
,问题消失了
这能被复制吗
错误的原因是什么
我知道104-105行是为了节省计算时间。如何修改当前函数以从预计算中获益,而不存在以相同的平均多次时间调用函数的问题?好吧,这段特定代码被破坏了。。。在
ignpoi.f
中,ll。218:
IF (mu.EQ.muold) GO TO 130
muold = mu
m = max0(1,ifix(mu))
l = 0
p = exp(-mu)
q = p
p0 = p
C
C STEP U. UNIFORM SAMPLE FOR INVERSION METHOD
C
130 u = ranf()
第一个条件为true,因此跳过m
、l
、p
、q
和p0
的初始化。在这些变量中,只有l
在前面被触摸过,但是mu==muold
也跳过了这一步
不幸的是,相当多的后续计算/分支依赖于上述变量,这导致了-请原谅双关语-随机行为
我不知道SEGFULT发生在哪里在你的情况下,在我的机器上我结束了一个无休止的循环。最简单的解决方案是禁用存储旧值。为此,请注释掉(或删除)行(144和219)
或者,禁用跳过初始化(l.218):
通过
gfortran-g-fbacktrace-Wall-check=all启用调试符号和简单检查,并报告您的发现。您可能需要显示完整的代码。谢谢!ranlib.f中还有其他类似的已知问题吗?另外,Fortran中随机数生成器的替代“包”是什么(与gfortran兼容)?我需要泊松分布、实均匀分布、整数均匀分布、二项式分布和高斯分布。@wallace1837对不起,我对ranlib没有任何经验。f我的答案纯粹来自分析ignpoi.f
。对于我所有涉及随机性的项目(很少)random\u number()
就足够了。
IF (mu.EQ.muold) GO TO 130
muold = mu
m = max0(1,ifix(mu))
l = 0
p = exp(-mu)
q = p
p0 = p
C
C STEP U. UNIFORM SAMPLE FOR INVERSION METHOD
C
130 u = ranf()
muold = mu
C IF (mu.EQ.muold) GO TO 130