我正在尝试在 gfortran 中使用四精度,但它似乎real*16
不起作用。经过一番摸索,我发现它可能实现为real*10
. real*10
实际上是四精度吗?
如何测试我的代码的精度?是否有用于测试精度的标准简单算法?例如,当我想弄清楚计算机 0 是什么时,我会继续除以 2.0,直到达到 0.0。跟踪这些值让我知道计算机何时“认为”我的非零数为零 - 给我计算机零。
有没有像我描述的那样用一种算法来计算精度的好方法?
添加到现有答案... 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` 是什么意思?
对现代 Fortran 代码使用种类,即
real(some_kind_value) :: variable
然后,您可以使用selected_real_kind()
或iso_fortran_env
模块或模块中的c_long_double
种类值iso_c_binding
来获取种类变量。所有这些都有略微不同的含义。
您可以使用epsilon()
、tiny()
或内在函数huge()
来nearest()
评估代码的实际精度。
gfortran 中的四精度通常需要libquadmath
大多数平台都可以使用的库,但默认情况下可能不可用。
kind 类型参数的 gfortran 文档回答了这个问题,特别是最后一句话,内容如下:
可用的种类参数可以在 ISO_FORTRAN_ENV 模块的常量数组 CHARACTER_KINDS、INTEGER_KINDS、LOGICAL_KINDS 和 REAL_KINDS 中找到(参见 ISO_FORTRAN_ENV)。
您可能已经发现,这real*16
并没有在您的平台上实现。
real(kind=10) 是所谓的扩展 80 位精度Wikipedia 80-bit。
real(kind=16) 是正确的四倍 128 位精度Wikipedia 128-bit。
如前所述,您可以使用 selected_real_kind()、epsilon()、tiny()、huge() 来选择和检查要使用的精度。
试试 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)上它可以工作。