Skip to content

Commit

Permalink
ieeeck: use ieee_arithmetic
Browse files Browse the repository at this point in the history
  • Loading branch information
perazz committed Feb 7, 2025
1 parent a541801 commit 9696a00
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 138 deletions.
84 changes: 12 additions & 72 deletions fypp/src/la_lapack_aux.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
module la_lapack_aux
use la_constants
use la_blas
use ieee_arithmetic, only: ieee_support_nan, ieee_support_inf
implicit none(type,external)
private

Expand Down Expand Up @@ -249,87 +250,26 @@ module la_lapack_aux
!> IEEECK: is called from the ILAENV to verify that Infinity and
!> possibly NaN arithmetic is safe (i.e. will not trap).

pure integer(ilp) function la_ieeeck( ispec, zero, one )
pure integer(ilp) function la_ieeeck(ispec,zero,one)
! -- lapack auxiliary routine --
! -- lapack is a software package provided by univ. of tennessee, --
! -- univ. of california berkeley, univ. of colorado denver and nag ltd..--
! Scalar Arguments
integer(ilp), intent(in) :: ispec
real(sp), intent(in) :: one, zero
! Scalar Arguments
integer(ilp),intent(in) :: ispec
real(sp),intent(in) :: one,zero
! =====================================================================
! Local Scalars
real(sp) :: nan1, nan2, nan3, nan4, nan5, nan6, neginf, negzro, newzro, posinf
! Executable Statements
! Executable Statements
la_ieeeck = 1
posinf = one / zero
if( posinf<=one ) then
la_ieeeck = 0
return
end if
neginf = -one / zero
if( neginf>=zero ) then
la_ieeeck = 0
return
end if
negzro = one / ( neginf+one )
if( negzro/=zero ) then
la_ieeeck = 0
return
end if
neginf = one / negzro
if( neginf>=zero ) then
la_ieeeck = 0
return
end if
newzro = negzro + zero
if( newzro/=zero ) then
la_ieeeck = 0
return
end if
posinf = one / newzro
if( posinf<=one ) then
la_ieeeck = 0
return
end if
neginf = neginf*posinf
if( neginf>=zero ) then
la_ieeeck = 0
return
end if
posinf = posinf*posinf
if( posinf<=one ) then

! Test support for infinity values
if (.not.ieee_support_inf(one)) then
la_ieeeck = 0
return
end if

! return if we were only asked to check infinity arithmetic
if( ispec==0 )return
nan1 = posinf + neginf
nan2 = posinf / neginf
nan3 = posinf / posinf
nan4 = posinf*zero
nan5 = neginf*negzro
nan6 = nan5*zero
if( nan1==nan1 ) then
la_ieeeck = 0
return
end if
if( nan2==nan2 ) then
la_ieeeck = 0
return
end if
if( nan3==nan3 ) then
la_ieeeck = 0
return
end if
if( nan4==nan4 ) then
la_ieeeck = 0
return
end if
if( nan5==nan5 ) then
la_ieeeck = 0
return
end if
if( nan6==nan6 ) then
if (ispec == 0) return
if (.not.ieee_support_nan(one)) then
la_ieeeck = 0
return
end if
Expand Down
72 changes: 6 additions & 66 deletions src/la_lapack_aux.f90
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module la_lapack_aux
use la_constants
use la_blas
use ieee_arithmetic, only: ieee_support_inf, ieee_support_nan
implicit none(type,external)
private

Expand Down Expand Up @@ -239,79 +240,18 @@ pure integer(ilp) function la_ieeeck(ispec,zero,one)
integer(ilp),intent(in) :: ispec
real(sp),intent(in) :: one,zero
! =====================================================================
! Local Scalars
real(sp) :: nan1,nan2,nan3,nan4,nan5,nan6,neginf,negzro,newzro,posinf
! Executable Statements
la_ieeeck = 1
posinf = one/zero
if (posinf <= one) then
la_ieeeck = 0
return
end if
neginf = -one/zero
if (neginf >= zero) then
la_ieeeck = 0
return
end if
negzro = one/(neginf + one)
if (negzro /= zero) then
la_ieeeck = 0
return
end if
neginf = one/negzro
if (neginf >= zero) then
la_ieeeck = 0
return
end if
newzro = negzro + zero
if (newzro /= zero) then
la_ieeeck = 0
return
end if
posinf = one/newzro
if (posinf <= one) then
la_ieeeck = 0
return
end if
neginf = neginf*posinf
if (neginf >= zero) then
la_ieeeck = 0
return
end if
posinf = posinf*posinf
if (posinf <= one) then

! Test support for infinity values
if (.not.ieee_support_inf(one)) then
la_ieeeck = 0
return
end if

! return if we were only asked to check infinity arithmetic
if (ispec == 0) return
nan1 = posinf + neginf
nan2 = posinf/neginf
nan3 = posinf/posinf
nan4 = posinf*zero
nan5 = neginf*negzro
nan6 = nan5*zero
if (nan1 == nan1) then
la_ieeeck = 0
return
end if
if (nan2 == nan2) then
la_ieeeck = 0
return
end if
if (nan3 == nan3) then
la_ieeeck = 0
return
end if
if (nan4 == nan4) then
la_ieeeck = 0
return
end if
if (nan5 == nan5) then
la_ieeeck = 0
return
end if
if (nan6 == nan6) then
if (.not.ieee_support_nan(one)) then
la_ieeeck = 0
return
end if
Expand Down

0 comments on commit 9696a00

Please sign in to comment.