2017-03-14 88 views
0

我在Fortran代码中为a=0.00001分配了一个实际变量。在打印下面的行上的变量时,给出a=9.9999997473787516E-006而不是1E-5避免为fortran实变量声明“_8”?

解决此问题的方法是声明a=0.00001_8a=0.00001_rk,并使用rk定义值8

我想在编程时避免这种underscore风格。有没有办法做到这一点没有下划线的是CC++

+2

有办法使用'0.00001'给像'0.0001_rk',但要真正回答这个问题_why_要避免使用(完全适合)的形式'0.0001_rk'将是有益的了解。我可以避免在我的程序中编写'0'来代替编写'1-1',但我怀疑有人会建议这样做。 – francescalus

+1

基本上为了更好的可读性,我不想有任何后缀。有时代码的长度会因多个地方的后缀而增加。有没有办法做到这一点,如在C或C + +,我们不使用任何后缀声明的变量? –

+0

你应该努力让你的代码可维护和便携。避免'_rk'表示法既不是那些东西。可读性很重要,但在这种情况下是次要的。 – Ross

回答

1

您可以使用该指数d,而不是E:

a=0.00001d0 

,如果你的变量已经被声明为双精度这是唯一有用的实(RK)王氏RK的定义为:

integer,parameter :: rk=selected_real_kind(15,100) 

另外,不要用_8_rk_8不可移植)。

+1

如果类型值'rk'(或'8')与双精度值相同,则为真。 – francescalus

+0

@francescalus几乎总是这样......除非我很久以前使用Cray或CDC电脑! –

+1

我在一个小时前使用了一个编译器,它会拒绝接受'1._8'。如果我问它,那个编译器也可以接受'rk'作为默认类型。 – francescalus

2

我会在这里列出几个选项,但最终答案是使用下划线标记。特别是在开发新代码时,所有实际变量都应使用kind参数。有几个很好的许多方法来定义一种参数:

  • ISO_FORTRAN_ENV具有通过它们的大小定义实数和整数:REAL32REAL64INT32INT64,等等。
  • 使用内部函数SELECTED_REAL_KIND获得一种具有指定的精度和指数范围
  • IEEE_SELECTED_REAL_KIND为IEEE兼容
  • ISO_C_BINDING包含C_DOUBLE和其他人对C的互操作性

这样一来,就可以实现在任何机器上所需的精度。例如,

use ISO_FORTRAN_ENV, only : wp => REAL64 
real(wp) :: x 

重要的部分是要显式声明wp。然后,如果你想要使用X具有值0.1,您使用

x = 0.1_wp 

这是FORTRAN符号将其设置为使用wp那种代表0.1。你不应该仅仅因为你认为它的可读性不好就拒绝它。


但是,我将包括一些其他选项。他们虽然不是很好!使用d代替e,这要求double precision,例如x = 0.1d0

  • 使用编译标志更改默认实样

    • 声明常量。在gfortran中,您通常会使用-fdefault-real-8 -fdefault-double-8。这个编译器选项并不总是存在的(当然不是完全相同的),也限制了你可以声明的可能的真实类型。

  • +0

    以及来自iso_c_binding的c_double – tim18

    +0

    我已经将你的建议添加到body ,谢谢@francescalus和蒂姆 – Ross