【发布时间】:2021-04-15 20:29:31
【问题描述】:
我是一名大学讲师,本学期我将使用 Fortran 90/95 作为编程语言来教授数值方法课程。课程的开始是从数字的表示开始,我想谈谈可以用 REAL(4)、REAL(8) 和 REAL(16) 表示的数字的限制。我打算在 OnlineGDB 上使用以下代码(这样学生就不必在他们的计算机上安装任何东西,这在远程学习时可能会很痛苦):
Program declare_reals
implicit none
real(kind = 4) :: a_huge, a_tiny ! single precision ; default if kind not specified
!real(4) :: a ! Equivalent to real(kind = 4) :: a
a_huge = huge(a_huge)
print*, "Max positive for real(4) : ", a_huge
a_tiny = tiny(a_tiny)
print*, "Min positive for real(4) : ", a_tiny
print*,
End Program declare_reals
有了这段代码,我得到了
Max positive for real(4) : 3.40282347E+38
Min positive for real(4) : 1.17549435E-38
但是,如果我写a_tiny = tiny(a_tiny)/2.0,输出就变成了
Min positive for real(4) : 5.87747175E-39
查看 gfortran 的文档(OnlineGDB 将其用作 f95 编译器),我的印象是tiny(x) 以下的任何内容都可能导致下溢,并且将显示零而不是非零数字。谁能帮我理解这里发生了什么?如果tiny(x) 没有产生可表示的最小正数,函数调用会显示什么?
【问题讨论】:
-
说实话,不。你能解释一下吗?
-
注意,特别是如果你在教这个,使用 4 和 8 以及其他字面常量作为种类值不是最佳实践,不能保证编译器会支持这些值。因此,不能保证上面的代码会编译。看看使用 iso_fortran_env 中的参数 real32 和 real64,它们会起作用。
-
代码现在编译的事实根本没有任何意义。这种做法是完全错误的,代码将无法编译,例如,使用默认设置的 Simply Fortran 或 NAG。确实,如果您正在教 Fortran,请不要使用 4 8 或 16 之类的幻数进行教学,请参阅 stackoverflow.com/questions/838310/fortran-90-kind-parameter 虽然独立程序员可以做他喜欢做的事,但如果没有其他人在该代码上工作,那么教师的标准和期望高得多。
-
@kvantour 当然。但是学生需要从一些东西开始,最好是一些他们甚至可以在自己的机器上进行实验的广泛应用。因为在 PDP-4 上可能有所不同,所以从不告诉任何事情,这不是一种好的教学方式。该标准故意避免讲述现实生活中发生的事情。并不意味着现实生活不存在。