"real*8"是什么意思?

37
该程序的Fortran 90手册表示:“所有实数变量和参数都以64位精度指定(即real*8)。”
根据Wikipedia,单精度对应32位精度,而双精度对应64位精度,因此该程序显然使用双精度。
但是,real*8是什么意思?
我认为8表示小数点后面有8个数字。然而,Wikipedia似乎说,单精度通常提供6-9个数字,而double precision通常提供15-17个数字。这是否意味着“64位精度”与real*8不一致?

提示:8字节=64位 - John Alexiou
3个回答

38

如评论中所示,real*8不是标准的Fortran。此FAQ条目有更多细节。话虽如此,一旦我们进入非标准领域...

8指的是数据类型使用的字节数

因此,32位整数沿着同样的线路是integer*4。(但也是非标准的。)

快速搜索发现这个Fortran数据类型指南,其中包括:

"real4"语句指定变量名称为单精度4字节实数,具有7位数字的精度和10的幂范围从-38到+38。在几乎所有32位计算机上,“real”语句与“real4”语句相同。

"real8"语句指定变量名称为双精度8字节实数,具有15位精度和-308到+308的数量级范围。在几乎所有32位计算机中,“double precision”语句与“real8”语句相同。

12
Jon Skeet因引用过时且误导性的参考资料回答Fortran问题而受到贬低。这个问题的其他答案表明了对现代Fortran更好的理解。 - High Performance Mark
12
@HighPerformanceMark:也许你能给我提供一个更有用的链接以便我进行转换?我肯定不会声称自己对Fortran有丝毫的了解,但是答案的核心(8代表字节数)实际上是错误或误导的吗? - Jon Skeet
这个答案严重误导,因为它似乎表明integer*4实际上是Fortran。但是它根本不是Fortran,从来没有成为任何Fortran标准的一部分,甚至包括旧版标准。 - Vladimir F Героям слава
@VladimirFГероямслава:我很乐意承认我根本不是Fortran程序员,但https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vna5/index.html表明`INTEGER*4`是Fortran 77的一部分。但如果完全删除那行代码更好的话,我也很乐意这样做。 - Jon Skeet
@VladimirFГероямслава:好吧——考虑到问题是以 real*8 的术语提出的,让它保持另一个类似非标准的参考感觉合理。我会编辑答案,参考FAQ并指出这是非标准的。 - Jon Skeet
显示剩余2条评论

26

现在Fortran至少有4种指定精度的方法。

如前所述,real*8指定了字节数。它有些过时但应该是安全的。

新的方法是使用“kind”。应该使用内置函数获取所需精度的kind。通过具体的数值来指定kind是有风险的,因为不同的编译器使用不同的值。

还有一种方式是使用ISO_C_Binding的命名类型。 这个问题讨论整数的kind系统--实数也非常类似。


9
更新:现在更常见地支持了Fortran 2008扩展的ISO环境模块。因此,如果您使用use ISO_FORTRAN_ENV,则可以通过位数指定实数和整数类型的kind值(例如,real (real32) ::real (real64) ::),这是一种标准且可移植的指定存储大小类型的方式。 - M. S. B.

16

星号符号(又称为TYPE*n)是Fortran中的一种非标准结构,如果与CHARACTER以外的TYPE一起使用,则需要注意。

如果应用于字符类型,则会创建一个由n个字符组成的数组(或字符串)。

如果应用于其他类型,则该符号指定了以字节为单位的存储大小。在Fortran 90+中引入了KIND类型概念后,应尽可能避免指定存储大小,这样可以避免创建不可移植的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接