Fortran Coder

查看: 19554|回复: 13

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

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
7 点
发表于 2015-4-8 15:30:40 | 显示全部楼层 |阅读模式
我是初学者,用CVF编译器,在程序计算过程中有个变量计算值是“-3.055427265967348E-002”,而用IVF编译器同样的变量计算值是“-3.055427265966992D-002”,这样的精度误差导致我最后想要求解的参数值就不一样,怎么解决啊?

953

帖子

0

主题

0

精华

大师

F 币
180 元
贡献
73 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
发表于 2015-4-8 16:41:15 | 显示全部楼层
0.00000000000044 的差别。
百分之 0.00000001 都不到的误差,如果你还是接受不了,那么数值计算可能不适合你。做解析解吧。

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

发表于 2015-4-9 00:06:41 | 显示全部楼层
0.00000000000044 的差别, 可能是編譯環境不同的微小差異
"最后想要求解的参数值就不一样"我猜是程式有邏輯上的錯誤



4

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
7 点
 楼主| 发表于 2015-4-9 08:39:36 | 显示全部楼层
chiangtp 发表于 2015-4-9 00:06
0.00000000000044 的差别, 可能是編譯環境不同的微小差異
"最后想要求解的参数值就不一样"我猜是程式有邏輯 ...

谢谢大家啊,我用的牛顿迭代算法,迭代次数多的话最终会导致结果相差的比较多,是不是没办法解决不同编译器的误差问题啊。

953

帖子

0

主题

0

精华

大师

F 币
180 元
贡献
73 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
发表于 2015-4-9 09:00:58 | 显示全部楼层
本帖最后由 vvt 于 2015-4-9 09:05 编辑

我没办法解决。
就我个人来看,如果这么小的偏差都能带来致命的错误,这是你的算法稳定性问题。


请你理解:
1. 计算机浮点数计算永远有误差。这就是为什么浮点数一般不做相等判断( if a == b)。
2. CVF和IVF只是误差上还有差别而已。也就是他俩的结果都不是真值。
3. 牛顿迭代法本身就是近似解。


4

帖子

1

主题

0

精华

新人

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

恩,是的,本身都是近似解,最后都能收敛,应该用哪个都可以,谢谢啊

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

发表于 2015-4-9 11:52:01 | 显示全部楼层
請容我追問: "最后求解的值不一样", 是怎的不一樣?

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

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

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

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

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

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

发表于 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

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 18:09

Powered by Tencent X3.4

© 2013-2024 Tencent

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