11

我正在尝试在 gfortran 中使用四精度,但它似乎real*16不起作用。经过一番摸索,我发现它可能实现为real*10. real*10 实际上是四精度吗?

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

有没有像我描述的那样用一种算法来计算精度的好方法?

4

5 回答 5

13

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

Fortran 要求您想要的精度的方法是使用 selected_real_kind 函数为您想要的精度定义一个 kind 值。

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

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

一个相关问题:`real*8` 是什么意思?

于 2012-07-09T17:47:59.057 回答
7

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

real(some_kind_value) :: variable

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

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

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

于 2012-07-09T17:11:18.960 回答
2

kind 类型参数的 gfortran 文档回答了这个问题,特别是最后一句话,内容如下:

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

您可能已经发现,这real*16并没有在您的平台上实现。

于 2012-07-09T16:31:41.473 回答
1

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

real(kind=16) 是正确的四倍 128 位精度Wikipedia 128-bit

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

于 2012-07-09T17:48:12.597 回答
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)上它可以工作。

于 2014-12-11T13:43:33.757 回答