如何在gfortran中使用和验证四倍精度?

时间:2012-07-09 16:22:56

标签: fortran precision

我正在尝试在gfortran中使用四元组精度,但似乎real*16不起作用。经过一些钓鱼后,我发现它可以实现为real*10real*10 实际上是四倍精度吗?

如何测试代码的精度?是否有标准的简单算法来测试精度?例如,当我想弄清楚什么是计算机零时,我继续除以2.0直到达到0.0。跟踪值让我知道计算机何时'认为'我的非零数字为零 - 给我计算机零。

有没有一种很好的方法可以用我所描述的算法来计算精度?

5 个答案:

答案 0 :(得分:12)

添加现有答案... real * N是语言的扩展,最好不要使用。真* 10不是四倍精度。被称为“扩展” - 它是由英特尔处理器提供的10字节类型。 real * 16可能在gfortran上可用,也可能不在gfortran上,具体取决于libquadmath的编译器版本,硬件和可用性。如果在软件中提供,则会很慢。

要求所需精度的Fortran方法是使用selected_real_kind函数来定义所需精度的种类值。

integer, parameter :: QR_K = selected_real_kind (32)
real (kind=QR_K) :: MyReal

如果可用,将获得四元实数。或者,使用Fortran 2008或更高版本,您可以“使用ISO_FORTRAN_ENV”,然后可以访问类型值REAL128。如果精度不可用,那么类型值将为-1。

相关问题:What does `real*8` mean?

答案 1 :(得分:6)

使用现代Fortran代码的种类,即

real(some_kind_value) :: variable

然后,您可以使用selected_real_kind()模块中的iso_fortran_envc_long_double模块或iso_c_binding种值来获取kind变量。所有这些都有不同的含义。

您可以使用epsilon()tiny()huge()nearest()内在函数来评估代码的实际精确度。

gfortran中的四元精度通常需要libquadmath库,大多数平台都可以使用它,但默认情况下可能不是。

答案 2 :(得分:2)

kind type parameters的gfortran文档回答了这个问题,特别是最后一句,其中包括:

  

可以在常量数组中找到可用的种类参数   中的CHARACTER_KINDS,INTEGER_KINDS,LOGICAL_KINDS和REAL_KINDS   ISO_FORTRAN_ENV模块(参见ISO_FORTRAN_ENV)。

您可能发现的是,您的平台上未实现real*16

答案 3 :(得分:1)

real(kind = 10)是所谓的扩展80位精度Wikipedia 80-bit

real(kind = 16)是正确的四倍128位预处理Wikipedia 128-bit

如前所述,您可以使用selected_real_kind(),epsilon(),tiny(),huge()来选择并检查要使用的精度。

答案 4 :(得分:0)

尝试gfortran命令

  

gfortran -fdefault-real-8 test.f -o test.exe

在测试文件上

      implicit double precision(a-h,o-z)
 1    continue
      print * , ' i:'
      read(5,*) i
      if(i.le.0) stop
      a=i
      b=sqrt(a)
      print * , b
      c=b*b
      print * , c
      goto 1
      end

在我的平台上(FEDORA 20)它可以工作。