在不使用double
的情况下,是否可以获得quadruple
精度超过16位的数字?如果可能,它是否依赖于编译器或其他东西?因为我知道有人说他正在使用double
精度并且具有22位精度。
答案 0 :(得分:6)
数据类型double precision
源于Fortran 77,对该类型的唯一要求是其精度高于real
。你不应该再使用它了。
在Fortran 90/95及更高版本中,支持至少两种大小的实数。精度由kind
参数确定,其值取决于编译器。
real(kind=8) :: a, b
要有一种可移植的定义精度的方法,您可以使用以下方法获得允许一定精度的kind
值:
integer, parameter :: long_double = SELECTED_REAL_KIND(22)
然后您可以将变量声明为
real(kind=long_double) :: a, b
但不确定您的编译器是否支持该精度,在这种情况下SELECTED_REAL_KIND
函数将返回负数。
答案 1 :(得分:5)
作为第一个答案陈述,最便携的方式是指定数字的精度是使用内在函数。该语言的设计概念是,您可以确定计算所需的精度并请求它,并且编译器提供精度或更高的精度。例如,如果您计算出微分方程解是稳定的11个十进制数,那么您可以请求此值,编译器会提供满足您要求的最佳类型。对于大多数程序员来说,这是一种外国的方法,他们习惯于考虑硬件提供的少数选择而不是他们需要的东西,也许并不那么容易,因为我们很少有人是数值分析师。
如果您想使用SELECTED_REAL_KIND内在函数并针对您的特定编译器和硬件进行优化,您可能希望进行试验。一些组合将在软件中提供四极精度,这将是缓慢的。具有双精度和10字节扩展精度的编译器将通过selected_real_kind(17)提供更长的类型。具有双精度和四倍精度但不是10字节扩展精度的编译器将通过selected_real_kind(17)或selected_real_kind(32)提供四极精度。 (我不知道任何支持10字节扩展和四极的编译器。)缺少四极精度的编译器将为selected_real_kind(32)返回-1。