使用Dislin的双精度错误

时间:2015-04-19 06:55:18

标签: function graph plot fortran double-precision

尝试编译时出现以下错误:

 call qplot (Z, B, m + 1)
             1
 Error: Type mismatch in argument 'x' at (1); passed REAL(8) to REAL(4)

一切似乎都是双精度的,所以我不禁认为它是一个Dislin错误,特别是考虑到它出现在参考Dislin声明中。我究竟做错了什么?我的代码如下:

program test

use dislin

integer :: i
integer, parameter :: n = 2
integer, parameter :: m = 5000
real (kind = 8) :: X(n + 1), Z(0:m), B(0:m)

X(1) = 1.D0
X(2) = 0.D0
X(3) = 2.D0

do i = 0, m
    Z(i) = -1.D0 + (2.D0*i) / m
    B(i) = f(Z(i))
end do

call qplot (Z, B, m + 1)

    read(*,*)

contains

real (kind = 8) function f(t)           
    implicit none
    real (kind = 8), intent(in) :: t
        real (kind = 8), parameter :: pi = Atan(1.D0)*4.D0  
            f = cos(pi*t)
end function f

end program

3 个答案:

答案 0 :(得分:1)

DISLIN manual我读到qplot需要(单精度)浮点数:

 QPLOT connects data points with lines.

The call is:    CALL QPLOT (XRAY, YRAY, N)  level 0, 1
or:     void qplot (const float *xray, const float *yray, int n);

XRAY, YRAY  are arrays that contain X- and Y-coordinates.
N   is the number of data points.

因此,您需要将ZB转换为real

call qplot (real(Z), real(B), m + 1)

请考虑使用ISO_Fortran_env模块和预定义常量REAL32REAL64,而不是使用固定数字来表示数字类型(在编译器之间有所不同)。

答案 1 :(得分:1)

qplot例程需要默认的真实。您可以转换数据

 call qplot(real(Z), real(B), m + 1)

我用kind = 8来说明这句话,这非常难看,如果你坚持8,至少宣布一个常数

   integer, parameter :: rp = 8

并使用

   real(rp) ::

答案 2 :(得分:1)

正如前两个答案所解释的那样,dislin例程的标准版本需要单精度参数。我发现使用它们最方便,因为我可能有单参数或双参数,使用real技术转换双变量的类型。似乎不太可能在图表上可以感知到丢失的精度。但是,如果您希望专门以双精度工作,则可以使用另一组例程。它们具有相同的名称,但采用双精度参数。要获得它们,请在库“dislin_d”中链接。