从此网站(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定义的,但是在这里已经定义了。
第二,如果单精度和双精度型是整数类型,那么如何给b和d赋予实值?
第三,当sNaN被定义为整数时,它如何容纳字符?
对不起,如果我的问题很愚蠢。谢谢您的帮助。
答案 0 :(得分:1)
让我尝试解释一下,希望我能解决您提出的所有问题...
所有Fortran标量都有一个kind
,用于指定此类变量采用的范围和精度。我熟悉的所有当前编译器(请注意,以下语句不一定适用于所有过去或将来的Fortran编译器)为实数和整数变量定义至少2种。如果您想将这些类型视为数字表示形式中的不同位数,那么您不会出错,尽管Fortran标准在确切表示数字的方式上有些含糊,将很多细节留给了我们。编译器作者,并专注于程序的解释。
逻辑,字符和复杂变量也有各种各样,但我们暂时将其保留。
内部例程selected_int_kind
和selected_real_kind
返回一个整数值,该整数值表示该类型的整数(实数)的特定编译器的“代码”。尽管不是全部,但许多编译器针对32位和64位整数(实数)分别使用4
和8
之类的代码-但不会挂在对应的同类代码上'是任意的,当前至少有一个编译器使用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
来指定种类代码。如果这让您有点挠头,请在SO上查找一些已经解决过的问题和问题。
我不确定我是否完全理解您句子中的隐含问题首先... 。正如我在上面所写,大多数当前的编译器对实数和整数使用相同种类的代码。最好不要考虑具有精度的整数,所有整数都是“实”整数的绝对精确等价物,整数变量的范围有限。另一方面,实数具有精度,目前大多数Fortran编译器都遵循IEEE754来规定精度和实数范围。
第二个... -您已声明b
和d
的类型为real
,当然它们具有真实值。
第三... -sNan
是通过声明的整数。术语Z"7FC0000"
是Fortran使用十六进制数字设置整数值的方式。 (您也可以将b
用作二进制数字字符串的前缀,o
用作八进制数字。)我希望,尽管我没有检查,133955584
是十进制等效项。
最后,您没有提供任何变量的值,因此处理器会将在内存中找到的任何位解释为指定类型的变量,并将其写出。