我正在研究一个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位数?
答案 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