回 帖 发 新 帖 刷新版面

主题:Rekease模式下,NAN error

以下程序,在alpha=0.0,cond=0.0 的时候,在build release模式的时候,出现cond=NAN 的错误,如果用debug模式build的话。cond会得到正确的值0.0.

大家帮忙看看什么原因。 谢谢!

*************************
tiny = 1.0E-30
a  = alpha
b  = one-a
cond  =  cond/(b+tiny)
cond2 = cond2/(a+tiny) 
*************************

回复列表 (共12个回复)

沙发

你的cond没有初始化就直接 cond  =  cond/(b+tiny)  ??

板凳


cond 在执行这一句前,已经赋值为0。应该算初始化过了吧

3 楼

cond在执行这一句之前,已经赋值为零。应该初始化过了

4 楼

one 呢?是 1 么?

5 楼

是的,one是1, 和所有其他变量一样都是双精度实型。

6 楼

我测试过,并没有发现这个问题。

我举得可能是:
1.你认为你的变量是 0 或者 1,然而实际上不是。
2.你认为cond 在此时是NaN,而实际上不是。

如果可能,你提供更多的代码,然后告诉我们你为什么认为cond是NaN呢?

7 楼

谢谢你的回复。下面是source code
**********************************************************
   cond   => dbm_get_arr(ip_cond  ,cond )
   cond2  => dbm_get_arr(ip_cond2 ,cond2 )
   alpha  => dbm_get_arr(ip_alpha,alpha )

    tiny2 = tiny*tiny
#做除法前output: alpha,cond,cond2.结果输出一维数组alpha(1,ncela)= #1.0D0,cond(1,ncela)=0.0,cond2是一些不等的实数。
    CALL pmatrix_rp(alpha, ncela,  ' alpha before dividing ')
    CALL pmatrix_rp(cond, ncela,   ' cond  before dividing ')
    CALL pmatrix_rp(cond2, ncela,  ' cond2 before dividing ')

     DO ic = 1,ncela
         a  = alpha(ic)
         b  = one-a
         cond(ic)  =  cond(ic)/(b+tiny2)
         cond2(ic) = cond2(ic)/(a+tiny2)
      END DO
#做除法后output: cond,cond2.结果输出一维数组cond(1,ncela)=NAN,cond2一组实数。
     CALL pmatrix_rp(cond, ncela,  ' cond after dividing ')
     CALL pmatrix_rp(cond2, ncela, ' cond2 after dividing ')

   NULLIFY( cond,cond2,alpha )
************************************************************


8 楼

还有要是改成下面这样,debug和release都可以了得到正确的值
a  = alpha
b  = one-a
a  = a+tiny
b  = b+tiny

cond  =  cond/(b)
cond2 = cond2/(a)  

不明白这两者的区别在哪

9 楼

你试试这样

把 one 改成 1.0D0

检查 tiny tiny2 a b 是不是定义为双精度的了?如果不是,改一下。

确认 tiny 的数值是否是0

10 楼

因为debug下编译器帮你做了一些工作. 而release要的是性能. 两种模式下结果不同很多时候值没有初始化.
代码不太长的话可以贴出来研究一下.

我来回复

您尚未登录,请登录后再回复。点此登录或注册