home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / t / lib / bigintpm.t < prev    next >
Text File  |  1999-07-20  |  7KB  |  378 lines

  1. #!./perl
  2.  
  3. BEGIN {
  4.     chdir 't' if -d 't';
  5.     unshift @INC, '../lib';
  6. }
  7.  
  8. use Math::BigInt;
  9.  
  10. $test = 0;
  11. $| = 1;
  12. print "1..278\n";
  13. while (<DATA>) {
  14.        chop;
  15.        if (s/^&//) {
  16.                $f = $_;
  17.        } else {
  18.                ++$test;
  19.                @args = split(/:/,$_,99);
  20.                $ans = pop(@args);
  21.                $try = "\$x = new Math::BigInt \"$args[0]\";";
  22.                if ($f eq "bnorm"){
  23.                    $try .= "\$x+0;";
  24.                } elsif ($f eq "bneg") {
  25.                    $try .= "-\$x;";
  26.                } elsif ($f eq "babs") {
  27.                    $try .= "abs \$x;";
  28.                } else {
  29.                    $try .= "\$y = new Math::BigInt \"$args[1]\";";
  30.                    if ($f eq "bcmp"){
  31.                        $try .= "\$x <=> \$y;";
  32.                    }elsif ($f eq "badd"){
  33.                        $try .= "\$x + \$y;";
  34.                    }elsif ($f eq "bsub"){
  35.                        $try .= "\$x - \$y;";
  36.                    }elsif ($f eq "bmul"){
  37.                        $try .= "\$x * \$y;";
  38.                    }elsif ($f eq "bdiv"){
  39.                        $try .= "\$x / \$y;";
  40.                    }elsif ($f eq "bmod"){
  41.                        $try .= "\$x % \$y;";
  42.                    }elsif ($f eq "bgcd"){
  43.                        $try .= "Math::BigInt::bgcd(\$x, \$y);";
  44.                    }elsif ($f eq "blsft"){
  45.                        $try .= "\$x << \$y;";
  46.                    }elsif ($f eq "brsft"){
  47.                        $try .= "\$x >> \$y;";
  48.                    }elsif ($f eq "band"){
  49.                        $try .= "\$x & \$y;";
  50.                    }elsif ($f eq "bior"){
  51.                        $try .= "\$x | \$y;";
  52.                    }elsif ($f eq "bxor"){
  53.                        $try .= "\$x ^ \$y;";
  54.                    }elsif ($f eq "bnot"){
  55.                        $try .= "~\$x;";
  56.                    } else { warn "Unknown op"; }
  57.                }
  58.                #print ">>>",$try,"<<<\n";
  59.                $ans1 = eval $try;
  60.                if ("$ans1" eq $ans) { #bug!
  61.                        print "ok $test\n";
  62.                } else {
  63.                        print "not ok $test\n";
  64.                        print "# '$try' expected: '$ans' got: '$ans1'\n";
  65.                }
  66.        }
  67. }
  68.  
  69. {
  70.   use Math::BigInt ':constant';
  71.  
  72.   $test++;
  73.   print "not " 
  74.     unless 2**150 eq "+1427247692705959881058285969449495136382746624";
  75.   print "ok $test\n";
  76.   $test++;
  77.   @a = ();
  78.   for ($i = 1; $i < 10; $i++) {
  79.     push @a, $i;
  80.   }
  81.   print "not " unless "@a" eq "+1 +2 +3 +4 +5 +6 +7 +8 +9";
  82.   print "ok $test\n";
  83. }
  84.  
  85. __END__
  86. &bnorm
  87. abc:NaN
  88.    1 a:NaN
  89. 1bcd2:NaN
  90. 11111b:NaN
  91. +1z:NaN
  92. -1z:NaN
  93. 0:+0
  94. +0:+0
  95. +00:+0
  96. +0 0 0:+0
  97. 000000  0000000   00000:+0
  98. -0:+0
  99. -0000:+0
  100. +1:+1
  101. +01:+1
  102. +001:+1
  103. +00000100000:+100000
  104. 123456789:+123456789
  105. -1:-1
  106. -01:-1
  107. -001:-1
  108. -123456789:-123456789
  109. -00000100000:-100000
  110. &bneg
  111. abd:NaN
  112. +0:+0
  113. +1:-1
  114. -1:+1
  115. +123456789:-123456789
  116. -123456789:+123456789
  117. &babs
  118. abc:NaN
  119. +0:+0
  120. +1:+1
  121. -1:+1
  122. +123456789:+123456789
  123. -123456789:+123456789
  124. &bcmp
  125. abc:abc:
  126. abc:+0:
  127. +0:abc:
  128. +0:+0:0
  129. -1:+0:-1
  130. +0:-1:1
  131. +1:+0:1
  132. +0:+1:-1
  133. -1:+1:-1
  134. +1:-1:1
  135. -1:-1:0
  136. +1:+1:0
  137. +123:+123:0
  138. +123:+12:1
  139. +12:+123:-1
  140. -123:-123:0
  141. -123:-12:-1
  142. -12:-123:1
  143. +123:+124:-1
  144. +124:+123:1
  145. -123:-124:1
  146. -124:-123:-1
  147. +100:+5:1
  148. &badd
  149. abc:abc:NaN
  150. abc:+0:NaN
  151. +0:abc:NaN
  152. +0:+0:+0
  153. +1:+0:+1
  154. +0:+1:+1
  155. +1:+1:+2
  156. -1:+0:-1
  157. +0:-1:-1
  158. -1:-1:-2
  159. -1:+1:+0
  160. +1:-1:+0
  161. +9:+1:+10
  162. +99:+1:+100
  163. +999:+1:+1000
  164. +9999:+1:+10000
  165. +99999:+1:+100000
  166. +999999:+1:+1000000
  167. +9999999:+1:+10000000
  168. +99999999:+1:+100000000
  169. +999999999:+1:+1000000000
  170. +9999999999:+1:+10000000000
  171. +99999999999:+1:+100000000000
  172. +10:-1:+9
  173. +100:-1:+99
  174. +1000:-1:+999
  175. +10000:-1:+9999
  176. +100000:-1:+99999
  177. +1000000:-1:+999999
  178. +10000000:-1:+9999999
  179. +100000000:-1:+99999999
  180. +1000000000:-1:+999999999
  181. +10000000000:-1:+9999999999
  182. +123456789:+987654321:+1111111110
  183. -123456789:+987654321:+864197532
  184. -123456789:-987654321:-1111111110
  185. +123456789:-987654321:-864197532
  186. &bsub
  187. abc:abc:NaN
  188. abc:+0:NaN
  189. +0:abc:NaN
  190. +0:+0:+0
  191. +1:+0:+1
  192. +0:+1:-1
  193. +1:+1:+0
  194. -1:+0:-1
  195. +0:-1:+1
  196. -1:-1:+0
  197. -1:+1:-2
  198. +1:-1:+2
  199. +9:+1:+8
  200. +99:+1:+98
  201. +999:+1:+998
  202. +9999:+1:+9998
  203. +99999:+1:+99998
  204. +999999:+1:+999998
  205. +9999999:+1:+9999998
  206. +99999999:+1:+99999998
  207. +999999999:+1:+999999998
  208. +9999999999:+1:+9999999998
  209. +99999999999:+1:+99999999998
  210. +10:-1:+11
  211. +100:-1:+101
  212. +1000:-1:+1001
  213. +10000:-1:+10001
  214. +100000:-1:+100001
  215. +1000000:-1:+1000001
  216. +10000000:-1:+10000001
  217. +100000000:-1:+100000001
  218. +1000000000:-1:+1000000001
  219. +10000000000:-1:+10000000001
  220. +123456789:+987654321:-864197532
  221. -123456789:+987654321:-1111111110
  222. -123456789:-987654321:+864197532
  223. +123456789:-987654321:+1111111110
  224. &bmul
  225. abc:abc:NaN
  226. abc:+0:NaN
  227. +0:abc:NaN
  228. +0:+0:+0
  229. +0:+1:+0
  230. +1:+0:+0
  231. +0:-1:+0
  232. -1:+0:+0
  233. +123456789123456789:+0:+0
  234. +0:+123456789123456789:+0
  235. -1:-1:+1
  236. -1:+1:-1
  237. +1:-1:-1
  238. +1:+1:+1
  239. +2:+3:+6
  240. -2:+3:-6
  241. +2:-3:-6
  242. -2:-3:+6
  243. +111:+111:+12321
  244. +10101:+10101:+102030201
  245. +1001001:+1001001:+1002003002001
  246. +100010001:+100010001:+10002000300020001
  247. +10000100001:+10000100001:+100002000030000200001
  248. +11111111111:+9:+99999999999
  249. +22222222222:+9:+199999999998
  250. +33333333333:+9:+299999999997
  251. +44444444444:+9:+399999999996
  252. +55555555555:+9:+499999999995
  253. +66666666666:+9:+599999999994
  254. +77777777777:+9:+699999999993
  255. +88888888888:+9:+799999999992
  256. +99999999999:+9:+899999999991
  257. &bdiv
  258. abc:abc:NaN
  259. abc:+1:abc:NaN
  260. +1:abc:NaN
  261. +0:+0:NaN
  262. +0:+1:+0
  263. +1:+0:NaN
  264. +0:-1:+0
  265. -1:+0:NaN
  266. +1:+1:+1
  267. -1:-1:+1
  268. +1:-1:-1
  269. -1:+1:-1
  270. +1:+2:+0
  271. +2:+1:+2
  272. +1000000000:+9:+111111111
  273. +2000000000:+9:+222222222
  274. +3000000000:+9:+333333333
  275. +4000000000:+9:+444444444
  276. +5000000000:+9:+555555555
  277. +6000000000:+9:+666666666
  278. +7000000000:+9:+777777777
  279. +8000000000:+9:+888888888
  280. +9000000000:+9:+1000000000
  281. +35500000:+113:+314159
  282. +71000000:+226:+314159
  283. +106500000:+339:+314159
  284. +1000000000:+3:+333333333
  285. +10:+5:+2
  286. +100:+4:+25
  287. +1000:+8:+125
  288. +10000:+16:+625
  289. +999999999999:+9:+111111111111
  290. +999999999999:+99:+10101010101
  291. +999999999999:+999:+1001001001
  292. +999999999999:+9999:+100010001
  293. +999999999999999:+99999:+10000100001
  294. &bmod
  295. abc:abc:NaN
  296. abc:+1:abc:NaN
  297. +1:abc:NaN
  298. +0:+0:NaN
  299. +0:+1:+0
  300. +1:+0:NaN
  301. +0:-1:+0
  302. -1:+0:NaN
  303. +1:+1:+0
  304. -1:-1:+0
  305. +1:-1:+0
  306. -1:+1:+0
  307. +1:+2:+1
  308. +2:+1:+0
  309. +1000000000:+9:+1
  310. +2000000000:+9:+2
  311. +3000000000:+9:+3
  312. +4000000000:+9:+4
  313. +5000000000:+9:+5
  314. +6000000000:+9:+6
  315. +7000000000:+9:+7
  316. +8000000000:+9:+8
  317. +9000000000:+9:+0
  318. +35500000:+113:+33
  319. +71000000:+226:+66
  320. +106500000:+339:+99
  321. +1000000000:+3:+1
  322. +10:+5:+0
  323. +100:+4:+0
  324. +1000:+8:+0
  325. +10000:+16:+0
  326. +999999999999:+9:+0
  327. +999999999999:+99:+0
  328. +999999999999:+999:+0
  329. +999999999999:+9999:+0
  330. +999999999999999:+99999:+0
  331. &bgcd
  332. abc:abc:NaN
  333. abc:+0:NaN
  334. +0:abc:NaN
  335. +0:+0:+0
  336. +0:+1:+1
  337. +1:+0:+1
  338. +1:+1:+1
  339. +2:+3:+1
  340. +3:+2:+1
  341. +100:+625:+25
  342. +4096:+81:+1
  343. &blsft
  344. abc:abc:NaN
  345. +2:+2:+8
  346. +1:+32:+4294967296
  347. +1:+48:+281474976710656
  348. +8:-2:NaN
  349. &brsft
  350. abc:abc:NaN
  351. +8:+2:+2
  352. +4294967296:+32:+1
  353. +281474976710656:+48:+1
  354. +2:-2:NaN
  355. &band
  356. abc:abc:NaN
  357. +8:+2:+0
  358. +281474976710656:+0:+0
  359. +281474976710656:+1:+0
  360. +281474976710656:+281474976710656:+281474976710656
  361. &bior
  362. abc:abc:NaN
  363. +8:+2:+10
  364. +281474976710656:+0:+281474976710656
  365. +281474976710656:+1:+281474976710657
  366. +281474976710656:+281474976710656:+281474976710656
  367. &bxor
  368. abc:abc:NaN
  369. +8:+2:+10
  370. +281474976710656:+0:+281474976710656
  371. +281474976710656:+1:+281474976710657
  372. +281474976710656:+281474976710656:+0
  373. &bnot
  374. abc:NaN
  375. +0:-1
  376. +8:-9
  377. +281474976710656:-281474976710657
  378.