Advertisement
Guest User

Etude des implementations de la fonction modulo

a guest
Feb 11th, 2016
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.41 KB | None | 0 0
  1. 2.5%3 -2.5%3 2%(-3) 2%3
  2. python 2.5 0.5 -1 2
  3. ruby 2.5 0.5 -1 2
  4. octave 2.5 0.5 -1 2
  5. graph 2.5 0.5 -1 2
  6. geogebra 2.5 0.5 2 2
  7. calc 2.5 -2.5 -1 2
  8. php 2.5 -2.5 2 2
  9. nodejs 2.5 -2.5 2 2
  10.  
  11.  
  12. GROUPE Amod
  13. x-floor(x/y)*y decript bien les lignes [2.5|0.5|-1|2]
  14. f(2.5,3.0) = 2.5
  15. f(-2.5,3.0) = 0.5
  16. f(2.0,-3.0) = -1.0
  17. f(2.0,3.0) = 2.0
  18.  
  19. GROUPE Bmod
  20. x-floor(x/y)*y+(y*(sign(x)-1))/2 decript bien les lignes [2.5|-2.5|-1|2] **
  21. f(2.5,3.0) = 2.5
  22. f(-2.5,3.0) = -2.5
  23. f(2.0,-3.0) = -1.0
  24. f(2.0,3.0) = 2.0
  25.  
  26. GROUPE Cmod
  27. x-floor(x/abs(y))*abs(y)+(abs(y)*(sign(x)-1))/2 decript bien les lignes [2.5,-2.5,2,2]
  28. f(2.5,3.0) = 2.5
  29. f(-2.5,3.0) = -2.5
  30. f(2.0,-3.0) = 2.0
  31. f(2.0,3.0) = 2.0
  32.  
  33. GROUPE Dmod
  34. x-floor(x/abs(y))*abs(y) decript bien les lignes [2.5|0.5|2|2]
  35. f(2.5,3.0) = 2.5
  36. f(-2.5,3.0) = 0.5
  37. f(2.0,-3.0) = 2.0
  38. f(2.0,3.0) = 2.0
  39.  
  40.  
  41. ** un peu plus d'elements semblant montrer que calc implemente le modulo comme decript :
  42. >>> f = lambda x,y: x-floor(x/y)*y+(y*(copysign(1,x)-1))/2
  43. predictions python verification calc
  44. >>> f(-8,-4.5) # ; -8 % -4.5
  45. 1.0 # 1
  46. >>> f(-2,-2.5) # ; -2 % -2.5
  47. 0.5 # 0.5
  48. >>> f(2,-2.5) # ; 2 % -2.5
  49. -0.5 # -0.5
  50. >>> f(2,-4) # ; 2 % -4
  51. -2.0 # -2
  52. >>> f(-68.84,-4338.4) # -68.84 % -4338.4
  53. 4269.56 # 4269.56
  54.  
  55. Amod = lambda x,y: x-floor(x/y)*y
  56. Bmod = lambda x,y: x-floor(x/y)*y+(y*(copysign(1,x)-1))/2
  57. Cmod = lambda x,y: x-floor(x/abs(y))*abs(y)+(abs(y)*(copysign(1,x)-1))/2
  58. Dmod = lambda x,y: x-floor(x/abs(y))*abs(y)
  59. testcase = [(0.0,1.0),(0.0,-1.0),(1.0,-1.0),
  60. (-1.0,-1.0),(9.0,91.5),(-3.8,7.0),
  61. (-66.0,53.75),(-66.0,-53.75),(-1.5,0.5),
  62. (900,-9000),(-900,-9000),(-900,9000)]
  63. expectations = map(lambda x: map(lambda u: x(*u),testcase),[Amod,Bmod,Cmod,Dmod])
  64. labels = ['Amod','Bmod','Cmod','Dmod']
  65. lines = map(lambda x: str(x)+' ',testcase)
  66. lines.insert(0,max(map(len,lines))*'-')
  67. for group in expectations:
  68. label = labels.pop(0)
  69. lines[0] += ' { %s } ' % label
  70. for i,result in enumerate(group):
  71. lines[i+1] += ('%s ' % result)
  72.  
  73. for line in lines:
  74. print(line)
  75.  
  76. ------------------ { Amod } { Bmod } { Cmod } { Dmod }
  77. (0.0, 1.0) 0.0 0.0 0.0 0.0
  78. (0.0, -1.0) 0.0 0.0 0.0 0.0
  79. (1.0, -1.0) 0.0 0.0 0.0 0.0
  80. (-1.0, -1.0) 0.0 1.0 -1.0 0.0
  81. (9.0, 91.5) 9.0 9.0 9.0 9.0
  82. (-3.8, 7.0) 3.2 -3.8 -3.8 3.2
  83. (-66.0, 53.75) 41.5 -12.25 -12.25 41.5
  84. (-66.0, -53.75) -12.25 41.5 -12.25 41.5
  85. (-1.5, 0.5) 0.0 -0.5 -0.5 0.0
  86. (900, -9000) -8100.0 -8100.0 900.0 900.0
  87. (-900, -9000) -900.0 8100.0 -900.0 8100.0
  88. (-900, 9000) 8100.0 -900.0 -900.0 8100.0
  89.  
  90. python
  91. [0.0, 0.0, 0.0, 0.0, 9.0, 3.2, 41.5, -12.25, 0.0, -8100, -900, 8100]
  92. v v v v v v v v v v v v Amod
  93.  
  94. php > $testcase = [[0,1],[0,-1],[1,-1],[-1,-1],[9,91.5],[-3.8,7],[-66,53.75],[-66,-53.75],[-1.5,0.5],[900,-9000],[-900,-9000],[-900,9000]];
  95. php > foreach ($testcase as $elem) {
  96. php { echo $elem[0].' '.$elem[1].' = '.fmod($elem[0],$elem[1])."\n";
  97. php { }
  98. 0 1 = 0 ok
  99. 0 -1 = 0 ok
  100. 1 -1 = 0 ok
  101. -1 -1 = -0 nok (-1)
  102. 9 91.5 = 9 ok
  103. -3.8 7 = -3.8 ok
  104. -66 53.75 = -12.25 ok
  105. -66 -53.75 = -15.25 ok
  106. -1.5 0.5 = -0 nok (-0.5)
  107. 900 -9000 = 900 ok
  108. -900 -9000 = -900 ok
  109. -900 9000 = -900 ok
  110.  
  111. -> Cmod mal defini ou nouveau groupe
  112.  
  113. irb(main):001:0> 0.0 % 1.0
  114. => 0.0 ok
  115. irb(main):002:0> 0.0 % -1.0
  116. => 0.0 ok
  117. irb(main):003:0> 1.0 % -1.0
  118. => 0.0 ok
  119. irb(main):004:0> -1.0 % -1.0
  120. => -0.0 ok (-0.0 ?)
  121. irb(main):005:0> 9.0 % 91.5
  122. => 9.0 ok
  123. irb(main):006:0> -3.8 % 7.0
  124. => 3.2 ok
  125. irb(main):007:0> -66.0 % 53.75
  126. => 41.5 ok
  127. irb(main):001:0> -66.0 % -53.75
  128. => -12.25 ok
  129. irb(main):008:0> -1.5 % 0.5
  130. => -0.0 ok (-0.0 ?)
  131. irb(main):009:0> 900.0 % -9000.0
  132. => -8100.0 ok
  133. irb(main):010:0> -900.0 % -9000.0
  134. => -900.0 ok
  135. irb(main):011:0> -900.0 % 9000.0
  136. => 8100.0 ok
  137.  
  138. => conforme avec Amod
  139.  
  140. geogebra :
  141. 0.00000000000000 1.00000000000000 0.00000000000000 ok
  142. 0.00000000000000 -1.00000000000000 0.00000000000000 ok
  143. 1.00000000000000 -1.00000000000000 0.00000000000000 ok
  144. -1.00000000000000 -1.00000000000000 0.00000000000000 ok
  145. 9.00000000000000 91.5000000000001 9.00000000000000 ok
  146. -3.80000000000000 7.00000000000000 3.20000000000000 ok
  147. -66.0000000000000 53.7500000000001 41.5000000000000 ok
  148. -66.0000000000000 -53.7500000000001 41.5000000000000 ok
  149. -1.50000000000000 0.500000000000001 0.00000000000000 ok
  150. 900.000000000000 -9000.00000000000 900.000000000000 ok
  151. -900.000000000000 -9000.00000000000 8100.00000000000 ok
  152. -900.000000000000 9000.00000000000 8100.00000000000 ok
  153.  
  154. => conforme avec Dmod
  155.  
  156. Calc
  157. ; 0 % 1
  158. 0 ok
  159. ; 0.0 % -1.0
  160. 0 ok
  161. ; 1.0 % -1.0
  162. 0 ok
  163. ; -1.0 % -1.0
  164. 0 nok (1)
  165. ; 9.0 % 91.5
  166. 9 ok
  167. ; -3.8 % 7.0
  168. -3.8 ok
  169. ; -66.0 % 53.75
  170. -12.25 ok
  171. ; -66.0 % -53.75
  172. 41.5 ok
  173. ; -1.5 % 0.5
  174. 0 nok (-0.5)
  175. ; 900.0 % -9000.0
  176. -8100 ok
  177. ; -900.0 % -9000.0
  178. 8100 ok
  179. ; -900.0 % 9000.0
  180. -900 ok
  181.  
  182. => irregularités avec Bmod ... mon modele est probablement faux
  183.  
  184. nodejs
  185. > 0.0 % 1.0
  186. 0 ok
  187. > 0.0 % -1.0
  188. 0 ok
  189. > 1.0 % -1.0
  190. 0 ok
  191. > -1.0 % -1.0
  192. -0 nok (-1)
  193. > 9.0 % 91.5
  194. 9 ok
  195. > -3.8 % 7.0
  196. -3.8 ok
  197. > -66.0 % 53.75
  198. -12.25 ok
  199. > -66.0 % -53.75
  200. -12.25 ok
  201. > -1.5 % 0.5
  202. -0 nok (-0.5)
  203. > 900.0 % -9000.0
  204. 900 ok
  205. > -900.0 % -9000.0
  206. -900 ok
  207. > -900.0 % 9000.0
  208. -900 ok
  209.  
  210. => toujours les memes irregularites avec Cmod, mon modele EST proche mais faux
  211.  
  212. graph
  213. 0 1 0 ok
  214. 0 -1 0 ok
  215. 1 -1 0 ok
  216. -1 -1 0 ok
  217. 9 91.5 9 ok
  218. -3.8 7 3.2 ok
  219. -66 53.75 41.5 ok
  220. -66 53.75 -12.25 ok
  221. -1.5 0.5 0 ok
  222. 900 -9000 -8100 ok
  223. -900 -9000 -900 ok
  224. -900 9000 8100 ok
  225.  
  226. => conforme a Amod
  227.  
  228. octave:1> mod(0,1)
  229. ans = 0 ok
  230. octave:2> mod(0,-1)
  231. ans = 0 ok
  232. octave:3> mod(1,-1)
  233. ans = 0 ok
  234. octave:4> mod(-1,-1)
  235. ans = 0 ok
  236. octave:5> mod(9,91.5)
  237. ans = 9 ok
  238. octave:6> mod(-3.8,7)
  239. ans = 3.2000 ok
  240. octave:7> mod(-66,53.75)
  241. ans = 41.500 ok
  242. octave:8> mod(-66,-53.75)
  243. ans = -12.250 ok
  244. octave:9> mod(-1.5,-0.5)
  245. ans = 0 ok
  246. octave:10> mod(900,-9000)
  247. ans = -8100 ok
  248. octave:11> mod(-900,-9000)
  249. ans = -900 ok
  250. octave:12> mod(-900,9000)
  251. ans = 8100 ok
  252.  
  253. => conforme a Amod
  254.  
  255. Attendu Obtenu
  256. python Amod 12 predictions obtenus sur 12
  257. ruby Amod 12 / 12
  258. octave Amod 12 / 12
  259. graph Amod 12 / 12
  260. geogebra Dmod 12 / 12
  261. calc Bmod 10 / 12 (-1.0 % -1.0 = 0 [predit 1], -1.5 % 0.5 = 0 [predit -0.5])
  262. php Cmod 10 / 12 (-1.0 % -1.0 = 0 [predit -1], -1.5 % 0.5 = 0 [predit -0.5])
  263. nodejs Cmod 10 / 12 (-1.0 % -1.0 = 0 [predit -1], -1.5 % 0.5 = 0 [predit -0.5])
  264.  
  265. conclusion:
  266. Amod probablement juste.
  267. Dmod probablement juste (mais a tester mieux).
  268. Bmod et Cmod probablement proches, mais comportent une erreur nettement definis definis, les cas d'echec etant les memes pour chaque implementations testes.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement