“真实*8”是啥意思?
Posted
技术标签:
【中文标题】“真实*8”是啥意思?【英文标题】:What does "real*8" mean?“真实*8”是什么意思? 【发布时间】:2012-05-18 05:56:25 【问题描述】:用 Fortran 90 编写的程序手册说:“所有实变量和参数都以 64 位精度指定(即real*8
)。”
根据Wikipedia,单精度对应32位精度,而双精度对应64位精度,所以显然程序使用双精度。
但是real*8
是什么意思?
我认为8
的意思是小数点后面有 8 位数字。但是,Wikipedia 似乎说单精度通常提供 6-9 位,而 double precision 通常提供 15-17 位。这是否意味着“64 位精度”语句与real*8
不一致?
【问题讨论】:
【参考方案1】:8 指的是数据类型使用的字节数。
所以一个 32 位整数是 integer*4
沿着相同的行。
快速搜索发现this guide to Fortran data types,其中包括:
“real*4”语句将变量名称指定为单精度 4 字节实数,精度为 7 位,幅度范围为 -38 到 +38 的 10。在几乎所有 32 位计算机中,“real”语句与“real*4”语句相同。
和
“real*8”语句将变量名称指定为双精度 8 字节实数,精度为 15 位,幅度范围为 -308 到 +308 的 10。在几乎所有 32 位计算机中,“双精度”语句与“real*8”语句相同。
【讨论】:
-1 表示 Jon Skeet 通过引用一个古老且具有误导性的参考资料来回答 Fortran 问题。这个问题的其他答案表明对现代 Fortran 有更好的理解。 @HighPerformanceMark:也许你可以给我一个更有用的链接让我改成这样?我当然不会声称我对 Fortran 有一点了解,但答案的核心(8 代表字节数)实际上是不正确或误导的吗?【参考方案2】:现在至少有 4 种方法可以在 Fortran 中指定精度。
正如已经回答的那样,real*8
指定字节数。它有些过时,但应该是安全的。
新方法是使用“种类”。应该使用内在函数来获得具有所需精度的类型。通过特定数值指定种类是有风险的,因为不同的编译器使用不同的值。
还有一种方法是使用 ISO_C_Binding 的命名类型。 This question 讨论了整数的种类系统——它与实数非常相似。
【讨论】:
更新:现在更普遍地支持 ISO 环境模块的 Fortran 2008 扩展。因此,如果您use ISO_FORTRAN_ENV
,您将可以访问按位数指定实数和整数类型的类型值(例如,real (real32) ::
和real (real64) ::
),作为按存储大小指定类型的标准且可移植的方式。【参考方案3】:
如果与TYPE
而非CHARACTER
一起使用,星号符号(称为TYPE*n
)是非标准的Fortran 构造。
如果应用于字符类型,它会创建一个n
字符数组(或n
字符字符串)。
如果应用于其他类型,它指定存储大小(以字节为单位)。在 Fortran 90+ 中应该不惜一切代价避免这种情况,其中引入了类型 KIND 的概念。指定存储大小会创建非便携式应用程序。
【讨论】:
以上是关于“真实*8”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章