“真实*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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

“?”是啥意思?在 Erlang 中是啥意思? [复制]

“this”这个词是啥意思,“static”是啥意思?

“||”是啥意思在 var 语句中是啥意思? [复制]

CVE是啥意思,CVE是啥意思

“内容”是啥意思:在招摇/openapi“响应”中是啥意思:

TypeScript 这个语法“-?”是啥意思? (破折号问题)是啥意思?