Fortran 95中的数值精度:

Fortran 95中的数值精度:,fortran,gfortran,fortran95,numerical-analysis,Fortran,Gfortran,Fortran95,Numerical Analysis,我有以下Fortran代码: Program Strange Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209; Real(Kind=8)::Pi2=3.1415926535897932384626433832795028841971693993751058209_8; Print*, "Pi1=", Pi1; Print*, "Pi2=", Pi2; End Pro

我有以下Fortran代码:

Program Strange
   Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209;
   Real(Kind=8)::Pi2=3.1415926535897932384626433832795028841971693993751058209_8;

   Print*, "Pi1=", Pi1;
   Print*, "Pi2=", Pi2;

End Program Strange
我使用gfortran编译,输出为:

 Pi1=   3.1415927410125732     
 Pi2=   3.1415926535897931

当然,第二种说法是正确的,但是否应该如此?似乎Pi1是作为一个单精度数字输入内存,然后放入一个双精度内存插槽。但这对我来说似乎是个错误。我说的对吗?

我不太懂Fortran,但我说:

字母“d”必须嵌入到文本中,否则,编译器的预处理器会将其舍入为单精度文本。例如,3.1415926535将被读取为3.141593,而3.1415926535d+0将在所有数字保持不变的情况下存储。双精度数字的字母“d”与单精度数字的字母“e”具有相同的含义


看来你的猜测是对的。

我确实懂一点Fortran@Dougal的回答是正确的,尽管他引用的代码片段不是,但将字母
d
嵌入到一个实际的文本常量中并不是必需的(自Fortran 90以来),事实上许多Fortran程序员现在认为这种方法是过时的。该代码段还建议使用
3.1415926535d+0
来初始化pi的64位浮点值,这也是一种误导,因为它没有将足够的数字设置为正确的值

声明:

Real(Kind=8)::Pi1=3.1415926535897932384626433832795028841971693993751058209
Pi1
定义为第8类实变量。然而,文字实数值
3.1415926535897932384626433832795028841971693993751058209
是默认类型的实数值,在大多数当前编译器上很可能是4字节实数。这似乎可以解释您的输出,但请检查您的文档

另一方面,通过种类规范的后缀,文字实值
Pi2=3.1415926535897932384626433832795028841971693993751058209_8
被声明为种类=8,这与它被赋值的变量的种类相同

还有三点:

1) 不要认为
kind=8
64位浮点数
double
的含义相同。对于许多编译器来说是这样,但对于某些编译器来说不是这样。种类号在Fortran实现之间不可移植。根据标准,它们是任意正整数。使用现代编译器,最好使用内部模块
iso_fortran\u env
中的预定义常量,例如

use, intrinsic :: iso_fortran_env
...
real(real64) :: pi = 3.14159265358979323846264338_real64
还有其他可移植的方法来使用函数设置变量种类,例如
selected\u real\u kind

2) 由于在程序执行期间,
pi
的值不太可能改变,因此您可能希望将其作为一个参数:

real(real64), parameter :: pi = 3.14159265358979323846264338_real64

3) 没有必要(或通常)以“;”结尾Fortran语句除非您希望在源文件的同一行中有多条语句。

非常清晰详细的答案。非常感谢。路人注意:kind=8不便于携带。对于不同的编译器,它产生的结果略有不同。更多信息请点击此处: