Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.91 KB | None | 0 0
  1. recursive function facHelper(n, acc) result(returner)
  2. integer::n
  3. integer::acc
  4. integer::returner
  5. if (n <= 1) then
  6. returner = acc
  7. else
  8. returner = facHelper(n - 1, n * acc)
  9. endif
  10. end function facHelper
  11.  
  12. function factorial(n)
  13. integer::n
  14. integer::factorial
  15. factorial = facHelper(n, 1)
  16. end function factorial
  17.  
  18. Error: Return type mismatch of function 'fachelper' at (1) (REAL(4)/INTEGER(4))
  19. Error: Return type mismatch of function 'factorial' at (1) (REAL(4)/INTEGER(4))
  20.  
  21. Error: Return type mismatch of function 'fachelper' at (1) (REAL(4)/INTEGER(4))
  22. Error: Return type mismatch of function 'factorial' at (1) (REAL(4)/INTEGER(4))
  23.  
  24. program test
  25. implicit none
  26. integer :: i
  27. do i=1,10
  28. write (*,'(i2,"! = ",i8)') i, factorial(i)
  29. end do
  30. contains
  31.  
  32. [cut and paste the code from your question]
  33.  
  34. end program
  35.  
  36. gfortran -std=f95 -o fac fac.f90
  37.  
  38. 1! = 1
  39. 2! = 2
  40. 3! = 6
  41. 4! = 24
  42. 5! = 120
  43. 6! = 720
  44. 7! = 5040
  45. 8! = 40320
  46. 9! = 362880
  47. 10! = 3628800
  48.  
  49. program test
  50. implicit none
  51. integer :: i
  52. interface
  53. function factorial(n)
  54. integer, intent(in) :: n
  55. integer :: factorial
  56. end function factorial
  57. end interface
  58.  
  59. do i=1,10
  60. write (*,'(i2,"! = ",i8)') i, factorial(i)
  61. end do
  62. end program
  63.  
  64. recursive function facHelper(n, acc) result(returner)
  65. implicit none
  66. integer, intent(in) :: n, acc
  67. integer :: returner
  68. if (n <= 1) then
  69. returner = acc
  70. else
  71. returner = facHelper(n - 1, n * acc)
  72. endif
  73. end function facHelper
  74.  
  75. function factorial(n)
  76. implicit none
  77. integer, intent(in) :: n
  78. integer :: factorial
  79. interface
  80. function facHelper(n,acc)
  81. integer, intent(in) :: n, acc
  82. integer :: facHelper
  83. end function
  84. end interface
  85. factorial = facHelper(n, 1)
  86. end function factorial
  87.  
  88. module fact
  89. private :: facHelper
  90. contains
  91.  
  92. recursive function facHelper(n, acc) result(returner)
  93. implicit none
  94. integer, intent(in) :: n, acc
  95. integer :: returner
  96. if (n <= 1) then
  97. returner = acc
  98. else
  99. returner = facHelper(n - 1, n * acc)
  100. endif
  101. end function facHelper
  102.  
  103. function factorial(n)
  104. implicit none
  105. integer, intent(in) :: n
  106. integer :: factorial
  107. factorial = facHelper(n, 1)
  108. end function factorial
  109. end module fact
  110.  
  111. program test
  112. use fact
  113. implicit none
  114. integer :: i
  115.  
  116. do i=1,10
  117. write (*,'(i2,"! = ",i8)') i, factorial(i)
  118. end do
  119. end program
  120.  
  121. recursive integer function facHelper(n, acc) result(returner)
  122.  
  123. function factorial(n)
  124. integer::n
  125. integer::factorial
  126. integer::facHelper ! <-- Missing information now available
  127. factorial = facHelper(n, 1)
  128. end function factorial
  129.  
  130. recursive function facHelper(n, acc) result(returner)
  131. integer::n
  132. integer::acc
  133. integer::returner
  134. if (n <= 1) then
  135. returner = acc
  136. else
  137. returner = facHelper(n - 1, n * acc)
  138. endif
  139. end function facHelper
  140.  
  141. function factorial(n)
  142. integer::n
  143. integer::factorial
  144. integer::facHelper
  145. factorial = facHelper(n, 1)
  146. end function factorial
  147.  
  148. recursive integer function facHelper(n, acc) result(returner)
  149. integer::n
  150. integer::acc
  151. if (n <= 1) then
  152. returner = acc
  153. else
  154. returner = facHelper(n - 1, n * acc)
  155. endif
  156. end function facHelper
  157.  
  158. integer function factorial(n)
  159. integer::n
  160. integer::facHelper
  161. factorial = facHelper(n, 1)
  162. end function factorial
  163.  
  164. gfortran --std=f95 -c ./fac.f95
  165.  
  166. recursive function tailFacHelper(n, acc) result(returner)
  167. integer (kind=8)::n
  168. integer (kind=8)::acc
  169. integer (kind=8)::returner
  170. if (n <= 1) then
  171. returner = acc
  172. else
  173. returner = tailFacHelper(n - 1, n * acc)
  174. endif
  175. end function tailFacHelper
  176.  
  177. function tailFac(n)
  178. integer (kind=8)::n
  179. integer (kind=8)::tailFac
  180. integer (kind=8)::tailFacHelper
  181. tailFac = tailFacHelper(n, 1_8)
  182. end function tailFac
  183.  
  184. recursive function vanillaFac(n) result(returner)
  185. integer (kind=8)::n
  186. integer (kind=8)::returner
  187. if (n <= 1) then
  188. returner = 1
  189. else
  190. returner = n * vanillaFac(n - 1)
  191. endif
  192. end function vanillaFac
  193.  
  194. f2py --overwrite-signature --no-lower fac.f95 -m liboptfac -h fac.pyf;
  195. f2py -c --f90flags=--std=f95 --opt=-O3 fac.pyf fac.f95;
  196. f2py --overwrite-signature --no-lower fac.f95 -m libnooptfac -h fac.pyf;
  197. f2py -c --f90flags=--std=f95 --noopt fac.pyf fac.f95;
  198.  
  199. python timer.py
  200.  
  201. *****Fortran (optimizations level 03 enabled)*****
  202.  
  203. liboptfac.vanillaFac(20)
  204. 1000000 calls
  205. Best of ten: 0.813575983047
  206.  
  207. liboptfac.tailFac(20)
  208. 1000000 calls
  209. Best of ten: 0.843787193298
  210.  
  211. liboptfac.tailFacHelper(20, 1)
  212. 1000000 calls
  213. Best of ten: 0.858899831772
  214.  
  215.  
  216. *****Fortran (no optimizations enabled)*****
  217.  
  218. libnooptfac.vanillaFac(20)
  219. 1000000 calls
  220. Best of ten: 1.00723600388
  221.  
  222. libnooptfac.tailFac(20)
  223. 1000000 calls
  224. Best of ten: 0.975327014923
  225.  
  226. libnooptfac.tailFacHelper(20, 1)
  227. 1000000 calls
  228. Best of ten: 0.982407093048
  229.  
  230.  
  231. *****Python*****
  232.  
  233. py_vanilla_fac(20)
  234. 1000000 calls
  235. Best of ten: 6.47849297523
  236.  
  237. py_tail_fac(20)
  238. 1000000 calls
  239. Best of ten: 6.93045401573
  240.  
  241. py_tail_fac_helper(20, 1)
  242. 1000000 calls
  243. Best of ten: 6.81205391884
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement