首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran中的乘法使用ifort和gfortran产生不同的结果

Fortran中的乘法使用ifort和gfortran产生不同的结果
EN

Stack Overflow用户
提问于 2021-01-21 22:44:45
回答 1查看 121关注 0票数 1

我有一个程序,可以在Linux上用gfortran-9编译,也可以在Windows上用ifort编译。windows编译就像是一个黑匣子,我对它没有多少访问权。

无论如何,在某些情况下,两个代码必须执行相同的乘法,但在小数点后13位的结果不同。

下面是我写的在Linux机器上测试这个乘法的测试代码:

代码语言:javascript
复制
      implicit none
      double precision:: a,b,c,d
 200  format(F35.20)
      b=20.17865682672815452747d0
      c=3.75000000000000000000d0
      d=32.17399999999999948841d0
      a=b*c*d
      write(*,200)a
      end program

在使用gfortran的Linux上,我有2434.60539278681835639873的值。在装有ifort的Windows上,完成相同的乘法运算,得到2434.60539278681881114608。两者都是使用-O2选项编译的。

我想不出有什么不同的原因。是不是因为双精度不能再精确了,我应该换成real(16)

感谢你的见解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-21 23:44:14

有3种不同的方法可以对乘法进行排序。Gfortran和ifort碰巧选择了不同的顺序。使用括号,您可以看到发生了什么:

代码语言:javascript
复制
ian@eris:~/work/stack$ cat mult.f90
implicit none
      double precision:: a,b,c,d
 200  format(F35.20)
      b=20.17865682672815452747d0
      c=3.75000000000000000000d0
      d=32.17399999999999948841d0
      a=(b*c)*d
      write(*,200)a
      b=20.17865682672815452747d0
      c=3.75000000000000000000d0
      d=32.17399999999999948841d0
      a=b*(c*d)
      write(*,200)a
      b=20.17865682672815452747d0
      c=3.75000000000000000000d0
      d=32.17399999999999948841d0
      a=c*(b*d)
      write(*,200)a
      end program
ian@eris:~/work/stack$ gfortran --version
GNU Fortran (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ian@eris:~/work/stack$ gfortran -O2 mult.f90
ian@eris:~/work/stack$ ./a.out
          2434.60539278681835639873
          2434.60539278681881114608
          2434.60539278681881114608

这两个答案都是完全正确的-你只是看到了浮点数学的效果之一。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65829843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档