Here is a possible way to have it generic using a module, although I wonder how useful it is ?
module degrees
!
real10, parameter :: deg_to_rad = 0.0174532925199432957692_3 ! radians per degree
!
interface sin_d
module procedure sin_d4, sin_d8, sin_d10
end interface sin_d
interface cos_d
module procedure cos_d4, cos_d8, cos_d10
end interface cos_d
!
contains
!
real4 function sin_d4 (x)
real4 :: x
sin_d4 = sin (xdeg_to_rad)
end function sin_d4
!
real8 function sin_d8 (x)
real8 :: x
sin_d8 = sin (xdeg_to_rad)
end function sin_d8
!
real10 function sin_d10 (x)
real10 :: x
sin_d10 = sin (xdeg_to_rad)
end function sin_d10
!
real4 function cos_d4 (x)
real4 :: x
cos_d4 = cos (xdeg_to_rad)
end function cos_d4
!
real8 function cos_d8 (x)
real8 :: x
cos_d8 = cos (xdeg_to_rad)
end function cos_d8
!
real10 function cos_d10 (x)
real10 :: x
cos_d10 = cos (x*deg_to_rad)
end function cos_d10
!
end module degrees
PROGRAM deg
!
use degrees
!
INTEGER i
real*4 x4
real*8 x8
real*10 x10
!
real*10 one, forty_five
one = 1
forty_five = 45
write (*,*) deg_to_rad, atan (one) / forty_five, deg_to_rad - atan (one) / forty_five
!
DO i=0,90,5
x4 = i
x8 = i
x10 = i
write (*,*) i, sin_d(x4), sin_d(x8), sin_d(x10)
end do
DO i=0,90,5
x4 = i
x8 = i
x10 = i
write (*,*) i, cos_d(x4), cos_d(x8), cos_d(x10)
end do
end