主题:Rekease模式下,NAN error
wooing
[专家分:0] 发布于 2011-01-23 22:40:00
以下程序,在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个回复)
沙发
yeg001 [专家分:14390] 发布于 2011-01-23 23:31:00
你的cond没有初始化就直接 cond = cond/(b+tiny) ??
板凳
wooing [专家分:0] 发布于 2011-01-23 23:48:00
cond 在执行这一句前,已经赋值为0。应该算初始化过了吧
3 楼
wooing [专家分:0] 发布于 2011-01-23 23:56:00
cond在执行这一句之前,已经赋值为零。应该初始化过了
4 楼
臭石头雪球 [专家分:23030] 发布于 2011-01-24 08:24:00
one 呢?是 1 么?
5 楼
wooing [专家分:0] 发布于 2011-01-24 09:14:00
是的,one是1, 和所有其他变量一样都是双精度实型。
6 楼
臭石头雪球 [专家分:23030] 发布于 2011-01-24 10:15:00
我测试过,并没有发现这个问题。
我举得可能是:
1.你认为你的变量是 0 或者 1,然而实际上不是。
2.你认为cond 在此时是NaN,而实际上不是。
如果可能,你提供更多的代码,然后告诉我们你为什么认为cond是NaN呢?
7 楼
wooing [专家分:0] 发布于 2011-01-24 10:41:00
谢谢你的回复。下面是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 楼
wooing [专家分:0] 发布于 2011-01-24 10:45:00
还有要是改成下面这样,debug和release都可以了得到正确的值
a = alpha
b = one-a
a = a+tiny
b = b+tiny
cond = cond/(b)
cond2 = cond2/(a)
不明白这两者的区别在哪
9 楼
臭石头雪球 [专家分:23030] 发布于 2011-01-24 10:49:00
你试试这样
把 one 改成 1.0D0
检查 tiny tiny2 a b 是不是定义为双精度的了?如果不是,改一下。
确认 tiny 的数值是否是0
10 楼
yeg001 [专家分:14390] 发布于 2011-01-24 23:44:00
因为debug下编译器帮你做了一些工作. 而release要的是性能. 两种模式下结果不同很多时候值没有初始化.
代码不太长的话可以贴出来研究一下.
我来回复