扩展双精度

Shi*_*bli 6 precision double fortran

是否可以精确地获得超过16位数double而不使用quadruple?如果可能,它是否依赖于编译器或其他东西?因为我知道有人说他正在double精确地工作并且具有22位精度.

ste*_*ert 6

数据类型double precision源自Fortran 77,对该类型的唯一要求是具有更高的精度real.你不应该再使用它了.

在Fortran 90/95及更高版本中,支持至少两种大小的实数.精度由kind参数确定,其值取决于编译器.

real(kind=8) :: a, b
Run Code Online (Sandbox Code Playgroud)

要使用可移植的方式定义精度,可以使用以下方法获取kind允许一定精度的值:

integer, parameter :: long_double = SELECTED_REAL_KIND(22)
Run Code Online (Sandbox Code Playgroud)

然后你可以将你的变量声明为

real(kind=long_double) :: a, b
Run Code Online (Sandbox Code Playgroud)

但不确定您的编译器是否支持该精度,在这种情况下该SELECTED_REAL_KIND函数将返回负数.

另见这篇文章

  • @Shibli以便携方式获取系统上的单精度和双精度浮点数通常也很有用.为此,可以使用`integer,parameter :: sp = kind(1.e0)`和`integer,parameter :: dp = kind(1.d0)`.然后,您可以将双精度浮点数声明为`real(kind = dp):: double`. (2认同)
  • @Chris注意,如果指定了精度标志,则在编译时将转换1.e0或1.d0,例如-r4或-r8用于ifort.因此,只有在未指定此类标志时,您的建议才有效. (2认同)

M. *_* B. 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.