Fortran Coder

标题: CVF和IVF不同编译器运行程序导致的数值不相等问题 [打印本页]

作者: 紫璇    时间: 2015-4-8 15:30
标题: CVF和IVF不同编译器运行程序导致的数值不相等问题
我是初学者,用CVF编译器,在程序计算过程中有个变量计算值是“-3.055427265967348E-002”,而用IVF编译器同样的变量计算值是“-3.055427265966992D-002”,这样的精度误差导致我最后想要求解的参数值就不一样,怎么解决啊?

作者: vvt    时间: 2015-4-8 16:41
0.00000000000044 的差别。
百分之 0.00000001 都不到的误差,如果你还是接受不了,那么数值计算可能不适合你。做解析解吧。
作者: chiangtp    时间: 2015-4-9 00:06
0.00000000000044 的差别, 可能是編譯環境不同的微小差異
"最后想要求解的参数值就不一样"我猜是程式有邏輯上的錯誤




作者: 紫璇    时间: 2015-4-9 08:39
chiangtp 发表于 2015-4-9 00:06
0.00000000000044 的差别, 可能是編譯環境不同的微小差異
"最后想要求解的参数值就不一样"我猜是程式有邏輯 ...

谢谢大家啊,我用的牛顿迭代算法,迭代次数多的话最终会导致结果相差的比较多,是不是没办法解决不同编译器的误差问题啊。
作者: vvt    时间: 2015-4-9 09:00
本帖最后由 vvt 于 2015-4-9 09:05 编辑

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


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



作者: 紫璇    时间: 2015-4-9 09:18
vvt 发表于 2015-4-9 09:00
我没办法解决。
就我个人来看,如果这么小的偏差都能带来致命的错误,这是你的算法稳定性问题。

恩,是的,本身都是近似解,最后都能收敛,应该用哪个都可以,谢谢啊
作者: chiangtp    时间: 2015-4-9 11:52
請容我追問: "最后求解的值不一样", 是怎的不一樣?
作者: pasuka    时间: 2015-4-9 12:44
单精度和双精度吧?
ivf编译的时候加上-r8或者-fdefault-real-8,默认使用双精度
精度还不够,可以上四精度,譬如-freal-4-real-16

作者: chiangtp    时间: 2015-4-9 13:07
0. "戰時"當如是, 单精度和双精度 cputime一樣
1. "平時"當追根究底, 非双精度不可者幾稀?
2. 不同編譯環境有不同的答案, 超乎"precision limit"能自圓其說的, 就是程式有邏輯上的錯誤
作者: chiangtp    时间: 2015-4-9 13:39
! 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


作者: 紫璇    时间: 2015-4-9 14:11
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。
作者: chiangtp    时间: 2015-4-9 14:27
建議您把程式PO上來, 大家集思廣益看看
作者: mangix2010    时间: 2015-4-14 11:33
这位是港台同胞啊
作者: kerb    时间: 2015-4-18 12:15
本帖最后由 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多位的精度,有时候会有影响的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2