matmul_6.f90

来自「用于进行gcc测试」· F90 代码 · 共 67 行

F90
67
字号
! { dg-do run }! PR 34566 - logical matmul used to give the wrong result.! We check this by running through every permutation in! multiplying two 3*3 matrices, and all permutations of multiplying! a 3-vector and a 3*3 matrices  and checking against equivalence! with integer matrix multiply.program main  implicit none  integer, parameter :: ki=4  integer, parameter :: dimen=3  integer :: i, j, k  real, dimension(dimen,dimen) :: r1, r2  integer, dimension(dimen,dimen) :: m1, m2  logical(kind=ki), dimension(dimen,dimen) :: l1, l2  logical(kind=ki), dimension(dimen*dimen) :: laux  logical(kind=ki), dimension(dimen) :: lv  integer, dimension(dimen) :: iv  do i=0,2**(dimen*dimen)-1     forall (k=1:dimen*dimen)        laux(k) = btest(i, k-1)     end forall     l1 = reshape(laux,shape(l1))     m1 = ltoi(l1)     ! Check matrix*matrix multiply     do j=0,2**(dimen*dimen)-1        forall (k=1:dimen*dimen)           laux(k) = btest(i, k-1)        end forall        l2 = reshape(laux,shape(l2))        m2 = ltoi(l2)        if (any(matmul(l1,l2) .neqv. (matmul(m1,m2) /= 0))) then          call abort        end if     end do     ! Check vector*matrix and matrix*vector multiply.     do j=0,2**dimen-1        forall (k=1:dimen)           lv(k) = btest(j, k-1)        end forall        iv = ltoi(lv)        if (any(matmul(lv,l1) .neqv. (matmul(iv,m1) /=0))) then          call abort        end if        if (any(matmul(l1,lv) .neqv. (matmul(m1,iv) /= 0))) then          call abort        end if     end do  end docontains  elemental function ltoi(v)    implicit none    integer :: ltoi    real :: rtoi    logical(kind=4), intent(in) :: v    if (v) then       ltoi = 1    else       ltoi = 0    end if  end function ltoiend program main

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?