在从这个网站( http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/kind.html )了解到Fortran中的selected_int_kind和selected_real_kind语句后,我在键入以下代码时遇到了这个问题:
program large_integers
integer, parameter :: Single = selected_int_kind(precision(1.e0))
integer, parameter :: Double = selected_int_kind(precision(1.d0))
integer(Single), parameter :: sNaN = Z"7FC0000"
integer (single) a
real(single) b
integer (double) c
real(double) d
write(*,*) 'a = ', a, 'b = ',b , 'c = ' , c, 'd= ', d , sNaN
end program large_integers 在运行它之后,它给出了以下结果:
A=1 b= -4.78538941E-39 c= 4294954096 d= 3.1846750471760586E-314 133955584
首先,精度不是为selected_int_kind定义的,而是仅为selected_real_kind定义的,但它就在这里。
其次,如果single和double是整型的,那么它如何给出b和d的实数值呢?
第三,当字符被定义为整数时,sNaN是如何工作的?
如果我的问题看起来很愚蠢,请原谅。谢谢你的帮助。
发布于 2019-04-10 16:17:58
让我试着解释一下,我希望我能回答你提出的所有问题……
所有的Fortran标量都有一个kind,它指定了这类变量的取值范围和精度。我所熟悉的所有当前编译器(请注意,下面的语句不一定适用于所有过去或将来的Fortran编译器)都为实数和整数变量定义了至少两种类型。如果您希望将这些类型视为数字表示中的不同位数,则不会错得太远,尽管Fortran标准对如何表示数字有点含糊,将大部分细节留给编译器编写人员,并将重点放在程序的解释上。
逻辑变量、字符变量和复变量也有种类,但我们暂时把它们放在一边。
内部例程selected_int_kind和selected_real_kind返回一个整数值,表示该类型的整数(实数)的特定编译器的“代码”。许多编译器,尽管不是所有的,都使用诸如4和8之类的代码来分别处理32位和64位整数(reals) -但是不要在对应关系上挂起钩来,种类的‘代码’是任意的,至少有一个当前的编译器使用2和3来代替这些代码。通过使用selected_n_kind例程,您的代码是独立于平台的,您永远不会显式地使用这些代码。
对我来说,使用带有实数参数的precision似乎很奇怪,就像你在调用selected_int_kind时所做的那样,通常我会期望看到整数字面参数。像selected_int_kind(n)这样的调用返回范围为-10^n .. 10^n的整数的种类代码,如果没有这样的整数,则返回-1。
碰巧,你很幸运,大多数当前的编译器对相同位数的整数和实数使用相同类型的代码,所以你可以使用selected_int_kind来获得这两者的代码,这不一定是真的,而获得实数类型的更好方法是使用selected_real_kind。
现在,您还可以求助于一些预定义的常量。内部模块iso_fortran_env声明了诸如real32和int64之类的常量,这些常量指定了种类代码,您可以直接use这些常量。如果这让你有点摸不着头脑,可以查阅一些Qs,就像这里一样,它们已经涵盖了这个问题。
首先,我不确定我完全理解了你句子中隐含的问题……正如我在上面写的,大多数当前的编译器对实数和整数使用相同类型的代码。最好不要认为整数有精度,所有的整数都是绝对精确的等价于‘实数’整数,整数变量的范围是有限的。另一方面,实数是有精度的,大多数Fortran编译器目前都遵循IEEE754对实数的精度和范围的规范。
第二…-你声明了b和d是real类型的,当然它们有实值。
第三... - sNan是一个声明的整数。术语Z"7FC0000"是Fortran使用十六进制数字设置整数值的方式。(也可以使用b作为二进制数字字符串的前缀,o作为八进制数字的前缀。)我希望,尽管我没有检查,133955584是十进制的等价物。
最后,您没有为任何变量提供值,因此处理器将在内存中找到的任何位解释为指定类型的变量,并将其写出。
https://stackoverflow.com/questions/55606398
复制相似问题