Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 包ranlib.f中的子例程ignpoi已损坏_Random_Fortran_Gfortran_Numerical Methods - Fatal编程技术网

Random 包ranlib.f中的子例程ignpoi已损坏

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

我在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 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