我正在尝试在gfortran中使用四元组精度,但似乎real*16
不起作用。经过一些钓鱼后,我发现它可以实现为real*10
。 real*10
实际上是四倍精度吗?
如何测试代码的精度?是否有标准的简单算法来测试精度?例如,当我想弄清楚什么是计算机零时,我继续除以2.0直到达到0.0。跟踪值让我知道计算机何时'认为'我的非零数字为零 - 给我计算机零。
有没有一种很好的方法可以用我所描述的算法来计算精度?
答案 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。
答案 1 :(得分:6)
使用现代Fortran代码的种类,即
real(some_kind_value) :: variable
然后,您可以使用selected_real_kind()
模块中的iso_fortran_env
或c_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)它可以工作。