Fortran Coder

查看: 20117|回复: 13
打印 上一主题 下一主题

[编译器] CVF和IVF不同编译器运行程序导致的数值不相等问题

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
7 点
跳转到指定楼层
楼主
发表于 2015-4-8 15:30:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我是初学者,用CVF编译器,在程序计算过程中有个变量计算值是“-3.055427265967348E-002”,而用IVF编译器同样的变量计算值是“-3.055427265966992D-002”,这样的精度误差导致我最后想要求解的参数值就不一样,怎么解决啊?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

59

帖子

2

主题

0

精华

大师

F 币
810 元
贡献
476 点
14#
发表于 2015-4-18 12:15:00 | 只看该作者
本帖最后由 kerb 于 2015-4-18 12:17 编辑

你的问题也许是你使用了内部函数,比如sin,cos,log等等,但是你在项目属性中使用了缺省的floating point设置,你可以试一下:Extend Precision of Single-Precision Constants设置为:fpconstant;Floating Point Model设置为Strict,否则如果你使用缺省的fast设置,内部函数的精度只有6位,大部分情况下不影响计算结果,但是如果你想超过10多位的精度,有时候会有影响的

35

帖子

2

主题

1

精华

专家

超子

F 币
565 元
贡献
196 点

规矩勋章

QQ
13#
发表于 2015-4-14 11:33:27 | 只看该作者
这位是港台同胞啊

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

12#
发表于 2015-4-9 14:27:55 | 只看该作者
建議您把程式PO上來, 大家集思廣益看看

4

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
7 点
11#
 楼主| 发表于 2015-4-9 14:11:24 | 只看该作者
chiangtp 发表于 2015-4-9 13:39
! Programmer的夢靨: Results are compiler/compile-option dependent
!--------------------------------- ...

您所指的程式有逻辑错误是什么意思呢?我不大懂啊,可以详细点吗?我现在是求解四个参数值,用CVF求解得到四个值分别是10, 152, 551,-0.531;用IVF得到的分别是14, 201, 730, -0.427。

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

10#
发表于 2015-4-9 13:39:03 | 只看该作者
! Programmer的夢靨: Results are compiler/compile-option dependent
!---------------------------------------------------------------------
! 冼鏡光,使用浮點數最最基本的觀念,DCview達人部落格,2008年5月12日
!
http://blog.dcview.com/article.php?a=Az0HYgNrBDU%3D
!---------------------------------------------------------------------
! 最常見而且最常用的數學運算定律有三個:交換律(commutative law),
! 結合律(associative law),與分配律(distributive law)。
! 在浮點數運算時,只有交換律成立,結合律與分配律都會出問題。
!---------------------------------------------------------------------
PROGRAM round_5
  IMPLICIT NONE

  INTEGER, PARAMETER :: rp=SELECTED_REAL_KIND(p=6)

  REAL(KIND=rp) :: R, x0, x1, x2, x3, x4, x5
  INTEGER       :: i

  !-------------------------------------

  R  = 3.0_rp
  x0 = 0.5_rp

  x1 = x0
  x2 = x0
  x3 = x0
  x4 = x0
  x5 = x0
  DO i = 0, 1000
    WRITE(*,'(1X,I4,2X,5G14.7)') i, x1, x2, x3, x4, x5

    x1 = (R+1.0_rp)*x1 - R*(x1*x1)
    x2 = (R+1.0_rp)*x2 - (R*x2)*x2
    x3 = ((R+1.0_rp) - R*x3)*x3
    x4 = R*x4 + (1.0_rp-R*x4)*x4
    x5 = x5 + R*(x5-x5*x5)

    IF( MOD(i,20) == 0 ) READ(*,*)
END DO

END PROGRAM round_5

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

9#
发表于 2015-4-9 13:07:37 | 只看该作者
0. "戰時"當如是, 单精度和双精度 cputime一樣
1. "平時"當追根究底, 非双精度不可者幾稀?
2. 不同編譯環境有不同的答案, 超乎"precision limit"能自圓其說的, 就是程式有邏輯上的錯誤

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

8#
发表于 2015-4-9 12:44:41 | 只看该作者
单精度和双精度吧?
ivf编译的时候加上-r8或者-fdefault-real-8,默认使用双精度
精度还不够,可以上四精度,譬如-freal-4-real-16

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

7#
发表于 2015-4-9 11:52:01 | 只看该作者
請容我追問: "最后求解的值不一样", 是怎的不一樣?

4

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
7 点
6#
 楼主| 发表于 2015-4-9 09:18:32 | 只看该作者
vvt 发表于 2015-4-9 09:00
我没办法解决。
就我个人来看,如果这么小的偏差都能带来致命的错误,这是你的算法稳定性问题。

恩,是的,本身都是近似解,最后都能收敛,应该用哪个都可以,谢谢啊
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 07:30

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表