【问题标题】:About Selected_int_kind statement关于 Selected_int_kind 声明
【发布时间】:2019-04-10 06:52:04
【问题描述】:

从这个网站 (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在定义为整数的同时持有一个字符是如何工作的?

如果我的问题看起来很愚蠢,请原谅。感谢您的帮助。

【问题讨论】:

  • 我相信 sNAN 的 BOZ 常数应该是 INT() 的参数以符合标准。

标签: fortran


【解决方案1】:

让我试着解释一下,我希望我能涵盖你提出的所有问题......

所有 Fortran 标量都有一个 kind,它指定了此类变量的范围和精度。我熟悉的所有当前编译器(请注意,以下语句不一定适用于所有过去或未来的 Fortran 编译器)为实数和整数变量定义了至少 2 种。如果您想将这些类型视为数字表示中的不同位数,那么您不会大错特错,尽管 Fortran 标准对数字的确切表示方式有点模糊,将很多细节留给编译器编写者并专注于程序的解释。

逻辑变量、字符变量和复杂变量也有不同的类型,但我们暂时将它们放在一边。

内部例程selected_int_kindselected_real_kind 返回一个整数值,表示特定编译器的“代码”,用于该类型的整数(实数)。许多编译器(尽管不是全部)使用诸如 48 之类的代码分别用于 32 位和 64 位整数(实数)——但不要纠结于对应关系,种类的“代码”是任意的,并且至少一个当前的编译器使用23 代替它们。通过使用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 声明了诸如real32int64 之类的常量,它们指定了种类代码,您可以只使用use 那些。如果这让您有点摸不着头脑,请在 SO 上查找一些 Q 和 As,它们已经涵盖了这个问题。

我不确定我是否完全理解您句子中隐含的问题首先...。正如我在上面所写的,大多数当前的编译器对实数和整数使用相同类型的代码。最好不要考虑具有精度的整数,所有整数都是“真实”整数的绝对精确等价物,整数变量的范围有限。另一方面,实数具有精度,大多数 Fortran 编译器目前遵循 IEEE754 的精度规范和范围规范。

第二个 ... - 你已经声明 bd 的类型为 real,当然它们有真正的值。

第三... - sNan 是声明的整数。术语 Z"7FC0000" 是 Fortran 使用十六进制数字设置整数值的方式。 (您也可以使用b 作为二进制数字字符串的前缀,o 用于八进制。)尽管我没有检查,但我希望 133955584 是十进制等价物。

最后,您没有为任何变量提供值,因此处理器将它在内存中找到的任何位解释为指定类型的变量并将它们写出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2019-07-11
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多