Fortran 95中的数值精度:
我有以下Fortran代码: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
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不便于携带。对于不同的编译器,它产生的结果略有不同。更多信息请点击此处: