24小时热门版块排行榜    

查看: 1420  |  回复: 3

mhyuan

金虫 (小有名气)

[求助] 在Linux下的Fortran程序计算问题

我在用Fortran语言写程序,但是遇到一个问题,大家瞧一瞧,看知不知道原因。
问题如下:

我用Fortran写了一个计算程序,但是在不用的Linux计算机上得到结果不同。我用了相同的Fortran编译器,其中一台机器是

pgf90 10.0-0 64-bit target on x86-64 Linux -tp nehalem-64

Copyright 1989-2000, The Portland Group, Inc. All Rights Reserved.

Copyright 2000-2009, STMicroelectronics, Inc. All Rights Reserved.



Intel(R) Fortran Intel(R) 64 Compiler Professional for applications running on Intel(R) 64, Version 11.1 Build 20100414 Package ID: l_cprof_p_11.1.072

Copyright (C) 1985-2010 Intel Corporation. All rights reserved.

这两个编译器得到的结果一样。


而另一台机器是

pgf90 10.0-0 64-bit target on x86-64 Linux -tp core2-64

Copyright 1989-2000, The Portland Group, Inc. All Rights Reserved.

Copyright 2000-2009, STMicroelectronics, Inc. All Rights Reserved.



Intel(R) Fortran Intel(R) 64 Compiler Professional for applications running on Intel(R) 64, Version 11.1 Build 20100414 Package ID: l_cprof_p_11.1.072

Copyright (C) 1985-2010 Intel Corporation. All rights reserved.

这两个结果整体趋势一样,有些细微的区别。

但是在两台机器上的结果不一样,有没有人详解一下原因。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
mhyuan: 金币+2 2012-06-28 21:47:24
不清楚是什么原因。

在 Fortran 中允许变量未经赋值就可以使用。各个编译器在未赋值变量赋初值上的标准是不统一的(因为标准中没有说),因此,会出现变量初值可能不同的情况,这或许是一个原因。

另外,在子程中的变量有可能有 SAVE 属性,至于哪些变量有 SAVE 属性,哪些没有,这个除非人为指定,否则各个编译器的处理方式也不同。这也是一个可能的原因。

这两个原因我都遇到过,所以写出来供参考。
2楼2012-06-26 12:22:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yaozhq

金虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
不同的硬件在计算的时候会产生不可重复的问题 主要是计算过程中的舍入等
这个和cpu的设计有关系……
整型数是精确的,浮点数并不是那样。举个简单的例子,0.2这个数无法用二进制的浮点数精确表示,并且有限的精度意味着微小的误差在经过多次操作后会改变结果。不同的编译器和CPU架构使用不同的精度存储临时数据,所以计算结果取决于你的运行环境。所以当你计算出结果并与你预期的结果进行比较时,会发现它们也许大不一样。
换句话说,如果你在计算中做如下比较:

if (result == expectedResult)

这个比较的结果几乎不可能为真。如果结果确实为真,那说明这个结果是不稳定的——输入数据、编译器、CPU的微小改变也许会使程序产生截然不同的结果。
3楼2012-06-27 14:10:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mhyuan

金虫 (小有名气)

引用回帖:
3楼: Originally posted by yaozhq at 2012-06-27 14:10:45
不同的硬件在计算的时候会产生不可重复的问题 主要是计算过程中的舍入等
这个和cpu的设计有关系……
整型数是精确的,浮点数并不是那样。举个简单的例子,0.2这个数无法用二进制的浮点数精确表示,并且有限的精度 ...

应该是跟机器有关系,我找到了原因,是在程序里面有一个变量在使用之前没有赋值为零,一台机器上默认为零,另一台机器上却不是,而且对于数组来说,竟然有的元素默认为零,有的不为零,看来变量在使用之前设置其等于零很重要。
4楼2012-06-28 21:50:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 mhyuan 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 太卷了 +12 shuigubio 2024-06-17 23/1150 2024-06-17 22:38 by master_110
[找工作] 药学硕士找不到工作,打算去做科研助理了 +5 pom戴墨镜 2024-06-14 12/600 2024-06-17 21:26 by 雨后春笋!
[基金申请] 化学会年会改成一年开一次了? +7 babu2015 2024-06-12 15/750 2024-06-17 20:28 by 落笔画枫
[论文投稿] 论文已接收,但发现修改稿传的是旧版该怎么办? +3 zsq54321 2024-06-15 6/300 2024-06-17 19:45 by wjykycg
[基金申请] 我标书代码变了 +44 学员NHuqdk 2024-06-16 58/2900 2024-06-17 17:39 by wenfengw83
[基金申请] 博后面上今天有bug可以看到是否资助? +22 lyfbangong 2024-06-12 33/1650 2024-06-17 16:17 by carolloo
[有机交流] 苯酚和炔醇反应,mitsunobu反应 5+3 TONGMEIMEI 2024-06-12 9/450 2024-06-17 15:00 by dschong
[找工作] 江西双非一本和四川双一流高校如何选择? 5+8 寒山敲钟 2024-06-12 25/1250 2024-06-16 22:05 by zhaojiang427
[基金申请] 博后基金,博管会会提前知道消息吗? +4 yuyiang 2024-06-13 4/200 2024-06-16 11:40 by yangyuzhong4
[基金申请] 关于博后基金的bug问题 +6 lxr1991 2024-06-14 9/450 2024-06-15 21:17 by since—2010
[基金申请] BO4的YQ答辩通知发布了吗? +6 博学笃行 2024-06-11 6/300 2024-06-15 16:04 by 悲催科研狗
[论文投稿] 投稿时忘记修改一作 +7 gll123456 2024-06-13 11/550 2024-06-15 11:49 by gll123456
[基金申请] 面上基金有一个(两个)C是不是就没戏了.... 5+3 zzzm116 2024-06-13 17/850 2024-06-14 22:26 by lzt8076
[基金申请] 工材E口JQ有消息了吗 +4 babyduck 2024-06-11 4/200 2024-06-14 17:23 by firepick
[基金申请] E12面上申请 +4 汉风之遗 2024-06-13 4/200 2024-06-14 15:28 by 天外飞去来
[有机交流] ππ堆积会发生在有机溶剂中吗 5+3 zibuyu0420 2024-06-13 4/200 2024-06-14 14:17 by 小肉干
[论文投稿] ACS Nano投稿后分配到副编辑手里12天了,能确定送审了吗? +5 潇洒怡惜 2024-06-12 10/500 2024-06-14 09:56 by 潇洒怡惜
[基金申请] 博士后面上项目状态还是专家评审吗 10+9 Thatcheremu 2024-06-13 55/2750 2024-06-13 21:23 by 乌合麒麟
[硕博家园] 机械研究生如何拿到年薪40+w +13 阿巴阿巴哦哦 2024-06-11 15/750 2024-06-13 15:40 by 113745685
[硕博家园] 申博 +3 悦悦小小鱼 2024-06-12 3/150 2024-06-12 15:11 by chen5805
信息提示
请填处理意见