如何减少复杂数组元素的长度

时间:2015-04-24 19:23:38

标签: fortran fortran90 fortran77 fortran95

我正在研究一个6乘6的矩阵来计算特征值和特征向量。我在开始时定义了特征值和特征向量的维数,如

INTEGER,PARAMETER ::  max=6, LDA=max, LDEVEC=max
COMPLEX :: EVAL(max), EVEC(LDEVEC, max)

如果我运行我的程序,我会得到像

这样的特征值
(8.8519789E-02,0.0000000E+00) (-8.8519737E-02,0.0000000E+00)
(-3.4551572E-03,8.2172059E-02) (3.4550922E-03,-8.2172029E-02)
(-3.4550924E-03,-8.2172029E-02) (3.4551430E-03,8.2172014E-02)

即。小数点后9位,但我需要每个特征值的长度,如

(8.85197E-02,0.00000E+00) (-8.85197E-02,0.00000E+00)
(-3.45515E-03,8.21720E-02) (3.45509E-03,-8.21720E-02)
(-3.45509E-03,-8.21720E-02) (3.45514E-03,8.21720E-02)

即。小数点后7位数。如何通过在初始化语句中使用某些命令来减少每个特征值的长度,即某些位置在这里

INTEGER,PARAMETER ::  max=6, LDA=max, LDEVEC=max
COMPLEX :: EVAL(max), EVEC(LDEVEC, max), EVAL_WP(max)

这样我可以得到特征值,每个元素在小数点后有7位数?

1 个答案:

答案 0 :(得分:3)

位数(就准确性而言)由变量的kind定义。它通常在使用整数位数的十进制系统中无法表示,因为浮点数定义为基数2.有关该主题的详细信息,请参阅wikipedia article。此外,如果您使用数学库(例如BLAS / LAPACK)来计算特征值,则您将被限制为单精度和双精度,这对应于一定数量的数字。

所以,总而言之,使用不同的声明可能无法做你想做的事情。

但是,使用写入语句的format说明符解决了您的问题:

program test

  write(*,*) sqrt(2.)
  write(*,'(E14.7E2)') +sqrt(2.)
  write(*,'(E14.7E2)') -sqrt(2.)

end program

结果

   1.41421354    
 0.1414214E+01
-0.1414214E+01

格式指定总共使用14个位置,点后面有7个位置,指数使用2个位置。您需要为点,值的符号,指数指示符和指数的符号分别添加一个字符。这会在点前面留下一个字符。

正如Vladimir建议的那样,您可以将format说明符存储在字符串中并重新使用它:

program test
  character(len=*),parameter :: cmplxFmt = "('(',E14.7E2,',',E14.7E2,')')"

  write(*,cmplxFmt) -sqrt(2.)*(1.,1.)
end program