sharpcoder 发表于 2014-12-25 10:56:51

CVF中函数的问题

最近在写一个程序,发现在CVF中将函数采用数学表达式的形式写在程序开始的地方,和单独写一个function进行调用,两者得到的计算结果不一样,不知道怎么回事,还请指导!

很抱歉,由于项目要求,无法将源代码贴在这里。我检查了所有参数声明和intent属性,没有发现什么不对的地方,不知道一般会有哪些原因导致?

楚香饭 发表于 2014-12-25 14:00:19

没有源代码很难说明问题。

你如果懂得如何 debug,可以尝试跟踪分析。

如果你的算法比较保密,可以试试把函数变换一下(比如去掉某些项,但依然能重现这种结果不一样),然后贴出来。

li913 发表于 2014-12-25 14:57:15

那个叫语句函数,比如   f(x)=2*x;需要对f和x的类型进行显示声明。

sharpcoder 发表于 2014-12-25 17:51:33

楚香饭 发表于 2014-12-25 14:00
没有源代码很难说明问题。

你如果懂得如何 debug,可以尝试跟踪分析。


这部分代码是属于一个迭代过程中的子程序,我已经debug200多次迭代了,还没有计算问题,正在试着看后面的情况,计算不一样的情况出在迭代很久之后,感觉很奇怪,但采用语句函数的时候确实和参考的一个程序的结果完全一样。

sharpcoder 发表于 2014-12-25 17:52:38

li913 发表于 2014-12-25 14:57
那个叫语句函数,比如   f(x)=2*x;需要对f和x的类型进行显示声明。

我是采用implicit real(a-h,k-z)的方式声明整个子程序的变量的。

刚从C转到Fortran,各种不适应啊!

vvt 发表于 2014-12-25 19:14:33

楼主可以用两种方法分别迭代,然后各自计算出一个结果。写入文件里,然后在文件里分析是哪一次计算结果不一致了。

灵活利用条件断点,也可快速判断。

sharpcoder 发表于 2014-12-26 16:30:43

查了下,浮点数的计算结果到后面就慢慢开始不一样了,估计是数值比较小的原因。
唉,一样的代码,在CVF、IVF、GFortran三个里面跑得到三个结果:
(1)CVF的和原来的参考结果一致
(2)IVF编译的时候选择了Qsave、iface:cvf、/arch:IA32、fp:source这几个参数,但是算到中间就出现数组索引值越界(编译时有越界检查,这个是计算的问题吧)
(3)GFortran编译信息很详细,warning很全面细致,但是计算结果和参考结果相比开始是一致的,到后面就不一样了,但是还能跑到底,不知道是不是由于代码中直接将Real*8计算的值直接赋给Real*4以及字符串截断导致的,具体的两个warning如下:
-------1-------Possible change of value in conversion from REAL(8) to REAL(4).
-------2-------CHARACTER expression will be truncated in assignment.
快崩溃了!

vvt 发表于 2014-12-26 16:40:12

1.不同编译器结果不一样很正常。
2.IVF 和 CVF 也可以warning很严格。你设置相关的编译选项就可以了。
3.如果计算结果差异很大,那么可能算法不稳定,或者写法不严谨(例如变量未初始化等)

li913 发表于 2014-12-27 09:17:30

sharpcoder 发表于 2014-12-26 16:30
查了下,浮点数的计算结果到后面就慢慢开始不一样了,估计是数值比较小的原因。
唉,一样的代码,在CVF、IV ...

cvf运行正确,ivf出现越界,这种情况一般是未初始化变量造成的。在cvf中,默认将变量初始化为零,ivf则不会或者不为零。看下面代码,在cvf中为6,ivf中为-858993454.
program test
implicit none
integer i, n
do i=1,3
n=n+i
end do
print*, n
end program

sharpcoder 发表于 2014-12-28 09:43:53

li913 发表于 2014-12-27 09:17
cvf运行正确,ivf出现越界,这种情况一般是未初始化变量造成的。在cvf中,默认将变量初始化为零,ivf则不 ...

这种情况能否在IVF加编译选项Qsave和Qzero完全解决?
如果要赋初值的话估计得有成百上千变量了,工作量不是一般的大。
另外,类似这种情况,变量i初值应该赋0还是1,还是只要有个初值都行?
页: [1] 2
查看完整版本: CVF中函数的问题