【问题标题】:Double-precision error using Dislin使用 Dislin 的双精度误差
【发布时间】:2015-04-19 06:55:18
【问题描述】:

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

 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

【问题讨论】:

  • 我认为你的编译器 kind=8 不是双精度的。请尝试使用双精度或选择类型例程。
  • 这是 gfortran。我用 kind = 8 编写了其他双精度程序。我尝试使用其他语句,但得到了同样的错误。
  • 感谢您的所有回答。它可以工作并编译。
  • 请不要用 solved 之类的噪音来改变问题... 相反,请接受答案。然后,每个人都可以看到您的问题已解决,以及如何。 [作为一个很好的副作用,你会因为接受答案而获得闪亮的虚假互联网积分;-)] 另外,请不要在标题中包含标签!

标签: function graph plot fortran double-precision


【解决方案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,而不是对数字类型使用固定数字(因编译器而异)。

【讨论】:

    【解决方案2】:

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

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

    我用kind = 8支持这句话,很丑,如果你坚持8至少声明一个常量

       integer, parameter :: rp = 8
    

    并使用

       real(rp) ::
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        相关资源
        最近更新 更多