module rational_arithmetic type Ratio integer :: num, den end type Ratio private cancel interface operator(*) module procedure ratmul end interface contains type(Ratio) function ratmul(r1, r2) implicit none type(Ratio), intent(in) :: r1, r2 ratmul%num = r1%num * r2%num ratmul%den = r1%den * r2%den call cancel(ratmul) end function ratmul subroutine cancel(rat) implicit none type(Ratio), intent(inout) :: rat integer u, v, r u = abs(rat%num) v = abs(rat%den) do if (v == 0) exit r = mod(u, v) u = v v = r end do rat%num = rat%num / u rat%den = rat%den / u end subroutine cancel end module rational_arithmetic program ratiofarm use rational_arithmetic type(Ratio) :: a, b, c a = Ratio(2,5) b = Ratio(1,6) c = a * b print*, c end program ratiofarm