home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / t / lib / bigfltpm.t < prev    next >
Text File  |  2000-03-03  |  12KB  |  464 lines

  1. #!./perl
  2.  
  3. BEGIN {
  4.     chdir 't' if -d 't';
  5.     @INC = '../lib';
  6. }
  7.  
  8. use Math::BigFloat;
  9.  
  10. $test = 0;
  11. $| = 1;
  12. print "1..362\n";
  13. while (<DATA>) {
  14.        chop;
  15.        if (s/^&//) {
  16.                $f = $_;
  17.     } elsif (/^\$.*/) {
  18.         eval "$_;";
  19.        } else {
  20.                ++$test;
  21.            if (m|^(.*?):(/.+)$|) {
  22.                $ans = $2;
  23.                    @args = split(/:/,$1,99);
  24.            }
  25.            else {
  26.                    @args = split(/:/,$_,99);
  27.                    $ans = pop(@args);
  28.            }
  29.                $try = "\$x = new Math::BigFloat \"$args[0]\";";
  30.                if ($f eq "fnorm"){
  31.                    $try .= "\$x+0;";
  32.                } elsif ($f eq "fneg") {
  33.                    $try .= "-\$x;";
  34.                } elsif ($f eq "fabs") {
  35.                    $try .= "abs \$x;";
  36.                } elsif ($f eq "fround") {
  37.                    $try .= "0+\$x->fround($args[1]);";
  38.                } elsif ($f eq "ffround") {
  39.                    $try .= "0+\$x->ffround($args[1]);";
  40.                } elsif ($f eq "fsqrt") {
  41.                    $try .= "0+\$x->fsqrt;";
  42.                } else {
  43.                    $try .= "\$y = new Math::BigFloat \"$args[1]\";";
  44.                    if ($f eq "fcmp") {
  45.                        $try .= "\$x <=> \$y;";
  46.                    } elsif ($f eq "fadd") {
  47.                        $try .= "\$x + \$y;";
  48.                    } elsif ($f eq "fsub") {
  49.                        $try .= "\$x - \$y;";
  50.                    } elsif ($f eq "fmul") {
  51.                        $try .= "\$x * \$y;";
  52.                    } elsif ($f eq "fdiv") {
  53.                        $try .= "\$x / \$y;";
  54.                    } else { warn "Unknown op"; }
  55.                }
  56.                #print ">>>",$try,"<<<\n";
  57.                $ans1 = eval $try;
  58.            if ($ans =~ m|^/(.*)$|) {
  59.                my $pat = $1;
  60.            if ($ans1 =~ /$pat/) {
  61.                        print "ok $test\n";
  62.            }
  63.            else {
  64.                        print "not ok $test\n";
  65.                        print "# '$try' expected: /$pat/ got: '$ans1'\n";
  66.            }
  67.            }
  68.                elsif ("$ans1" eq $ans) { #bug!
  69.                        print "ok $test\n";
  70.                } else {
  71.                        print "not ok $test\n";
  72.                        print "# '$try' expected: '$ans' got: '$ans1'\n";
  73.                }
  74.        }
  75. __END__
  76. &fnorm
  77. abc:NaN.
  78.    1 a:NaN.
  79. 1bcd2:NaN.
  80. 11111b:NaN.
  81. +1z:NaN.
  82. -1z:NaN.
  83. 0:0.
  84. +0:0.
  85. +00:0.
  86. +0 0 0:0.
  87. 000000  0000000   00000:0.
  88. -0:0.
  89. -0000:0.
  90. +1:1.
  91. +01:1.
  92. +001:1.
  93. +00000100000:100000.
  94. 123456789:123456789.
  95. -1:-1.
  96. -01:-1.
  97. -001:-1.
  98. -123456789:-123456789.
  99. -00000100000:-100000.
  100. 123.456a:NaN.
  101. 123.456:123.456
  102. 0.01:.01
  103. .002:.002
  104. -0.0003:-.0003
  105. -.0000000004:-.0000000004
  106. 123456E2:12345600.
  107. 123456E-2:1234.56
  108. -123456E2:-12345600.
  109. -123456E-2:-1234.56
  110. 1e1:10.
  111. 2e-11:.00000000002
  112. -3e111:-3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
  113. -4e-1111:-.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
  114. &fneg
  115. abd:NaN.
  116. +0:0.
  117. +1:-1.
  118. -1:1.
  119. +123456789:-123456789.
  120. -123456789:123456789.
  121. +123.456789:-123.456789
  122. -123456.789:123456.789
  123. &fabs
  124. abc:NaN.
  125. +0:0.
  126. +1:1.
  127. -1:1.
  128. +123456789:123456789.
  129. -123456789:123456789.
  130. +123.456789:123.456789
  131. -123456.789:123456.789
  132. &fround
  133. $Math::BigFloat::rnd_mode = 'trunc'
  134. +10123456789:5:10123000000
  135. -10123456789:5:-10123000000
  136. +10123456789:9:10123456700
  137. -10123456789:9:-10123456700
  138. +101234500:6:101234000
  139. -101234500:6:-101234000
  140. $Math::BigFloat::rnd_mode = 'zero'
  141. +20123456789:5:20123000000
  142. -20123456789:5:-20123000000
  143. +20123456789:9:20123456800
  144. -20123456789:9:-20123456800
  145. +201234500:6:201234000
  146. -201234500:6:-201234000
  147. $Math::BigFloat::rnd_mode = '+inf'
  148. +30123456789:5:30123000000
  149. -30123456789:5:-30123000000
  150. +30123456789:9:30123456800
  151. -30123456789:9:-30123456800
  152. +301234500:6:301235000
  153. -301234500:6:-301234000
  154. $Math::BigFloat::rnd_mode = '-inf'
  155. +40123456789:5:40123000000
  156. -40123456789:5:-40123000000
  157. +40123456789:9:40123456800
  158. -40123456789:9:-40123456800
  159. +401234500:6:401234000
  160. -401234500:6:-401235000
  161. $Math::BigFloat::rnd_mode = 'odd'
  162. +50123456789:5:50123000000
  163. -50123456789:5:-50123000000
  164. +50123456789:9:50123456800
  165. -50123456789:9:-50123456800
  166. +501234500:6:501235000
  167. -501234500:6:-501235000
  168. $Math::BigFloat::rnd_mode = 'even'
  169. +60123456789:5:60123000000
  170. -60123456789:5:-60123000000
  171. +60123456789:9:60123456800
  172. -60123456789:9:-60123456800
  173. +601234500:6:601234000
  174. -601234500:6:-601234000
  175. &ffround
  176. $Math::BigFloat::rnd_mode = 'trunc'
  177. +1.23:-1:1.2
  178. -1.23:-1:-1.2
  179. +1.27:-1:1.2
  180. -1.27:-1:-1.2
  181. +1.25:-1:1.2
  182. -1.25:-1:-1.2
  183. +1.35:-1:1.3
  184. -1.35:-1:-1.3
  185. -0.006:-1:0
  186. -0.006:-2:0
  187. -0.0065:-3:/-0\.006|-6e-03
  188. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  189. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  190. $Math::BigFloat::rnd_mode = 'zero'
  191. +2.23:-1:/2.2(?:0{5}\d+)?
  192. -2.23:-1:/-2.2(?:0{5}\d+)?
  193. +2.27:-1:/2.(?:3|29{5}\d+)
  194. -2.27:-1:/-2.(?:3|29{5}\d+)
  195. +2.25:-1:/2.2(?:0{5}\d+)?
  196. -2.25:-1:/-2.2(?:0{5}\d+)?
  197. +2.35:-1:/2.(?:3|29{5}\d+)
  198. -2.35:-1:/-2.(?:3|29{5}\d+)
  199. -0.0065:-1:0
  200. -0.0065:-2:/-0\.01|-1e-02
  201. -0.0065:-3:/-0\.006|-6e-03
  202. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  203. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  204. $Math::BigFloat::rnd_mode = '+inf'
  205. +3.23:-1:/3.2(?:0{5}\d+)?
  206. -3.23:-1:/-3.2(?:0{5}\d+)?
  207. +3.27:-1:/3.(?:3|29{5}\d+)
  208. -3.27:-1:/-3.(?:3|29{5}\d+)
  209. +3.25:-1:/3.(?:3|29{5}\d+)
  210. -3.25:-1:/-3.2(?:0{5}\d+)?
  211. +3.35:-1:/3.(?:4|39{5}\d+)
  212. -3.35:-1:/-3.(?:3|29{5}\d+)
  213. -0.0065:-1:0
  214. -0.0065:-2:/-0\.01|-1e-02
  215. -0.0065:-3:/-0\.006|-6e-03
  216. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  217. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  218. $Math::BigFloat::rnd_mode = '-inf'
  219. +4.23:-1:/4.2(?:0{5}\d+)?
  220. -4.23:-1:/-4.2(?:0{5}\d+)?
  221. +4.27:-1:/4.(?:3|29{5}\d+)
  222. -4.27:-1:/-4.(?:3|29{5}\d+)
  223. +4.25:-1:/4.2(?:0{5}\d+)?
  224. -4.25:-1:/-4.(?:3|29{5}\d+)
  225. +4.35:-1:/4.(?:3|29{5}\d+)
  226. -4.35:-1:/-4.(?:4|39{5}\d+)
  227. -0.0065:-1:0
  228. -0.0065:-2:/-0\.01|-1e-02
  229. -0.0065:-3:/-0\.007|-7e-03
  230. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  231. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  232. $Math::BigFloat::rnd_mode = 'odd'
  233. +5.23:-1:/5.2(?:0{5}\d+)?
  234. -5.23:-1:/-5.2(?:0{5}\d+)?
  235. +5.27:-1:/5.(?:3|29{5}\d+)
  236. -5.27:-1:/-5.(?:3|29{5}\d+)
  237. +5.25:-1:/5.(?:3|29{5}\d+)
  238. -5.25:-1:/-5.(?:3|29{5}\d+)
  239. +5.35:-1:/5.(?:3|29{5}\d+)
  240. -5.35:-1:/-5.(?:3|29{5}\d+)
  241. -0.0065:-1:0
  242. -0.0065:-2:/-0\.01|-1e-02
  243. -0.0065:-3:/-0\.007|-7e-03
  244. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  245. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  246. $Math::BigFloat::rnd_mode = 'even'
  247. +6.23:-1:/6.2(?:0{5}\d+)?
  248. -6.23:-1:/-6.2(?:0{5}\d+)?
  249. +6.27:-1:/6.(?:3|29{5}\d+)
  250. -6.27:-1:/-6.(?:3|29{5}\d+)
  251. +6.25:-1:/6.2(?:0{5}\d+)?
  252. -6.25:-1:/-6.2(?:0{5}\d+)?
  253. +6.35:-1:/6.(?:4|39{5}\d+)
  254. -6.35:-1:/-6.(?:4|39{5}\d+)
  255. -0.0065:-1:0
  256. -0.0065:-2:/-0\.01|-1e-02
  257. -0.0065:-3:/-0\.006|-6e-03
  258. -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  259. -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
  260. &fcmp
  261. abc:abc:
  262. abc:+0:
  263. +0:abc:
  264. +0:+0:0
  265. -1:+0:-1
  266. +0:-1:1
  267. +1:+0:1
  268. +0:+1:-1
  269. -1:+1:-1
  270. +1:-1:1
  271. -1:-1:0
  272. +1:+1:0
  273. -1.1:0:-1
  274. +0:-1.1:1
  275. +1.1:+0:1
  276. +0:+1.1:-1
  277. +123:+123:0
  278. +123:+12:1
  279. +12:+123:-1
  280. -123:-123:0
  281. -123:-12:-1
  282. -12:-123:1
  283. +123:+124:-1
  284. +124:+123:1
  285. -123:-124:1
  286. -124:-123:-1
  287. &fadd
  288. abc:abc:NaN.
  289. abc:+0:NaN.
  290. +0:abc:NaN.
  291. +0:+0:0.
  292. +1:+0:1.
  293. +0:+1:1.
  294. +1:+1:2.
  295. -1:+0:-1.
  296. +0:-1:-1.
  297. -1:-1:-2.
  298. -1:+1:0.
  299. +1:-1:0.
  300. +9:+1:10.
  301. +99:+1:100.
  302. +999:+1:1000.
  303. +9999:+1:10000.
  304. +99999:+1:100000.
  305. +999999:+1:1000000.
  306. +9999999:+1:10000000.
  307. +99999999:+1:100000000.
  308. +999999999:+1:1000000000.
  309. +9999999999:+1:10000000000.
  310. +99999999999:+1:100000000000.
  311. +10:-1:9.
  312. +100:-1:99.
  313. +1000:-1:999.
  314. +10000:-1:9999.
  315. +100000:-1:99999.
  316. +1000000:-1:999999.
  317. +10000000:-1:9999999.
  318. +100000000:-1:99999999.
  319. +1000000000:-1:999999999.
  320. +10000000000:-1:9999999999.
  321. +123456789:+987654321:1111111110.
  322. -123456789:+987654321:864197532.
  323. -123456789:-987654321:-1111111110.
  324. +123456789:-987654321:-864197532.
  325. &fsub
  326. abc:abc:NaN.
  327. abc:+0:NaN.
  328. +0:abc:NaN.
  329. +0:+0:0.
  330. +1:+0:1.
  331. +0:+1:-1.
  332. +1:+1:0.
  333. -1:+0:-1.
  334. +0:-1:1.
  335. -1:-1:0.
  336. -1:+1:-2.
  337. +1:-1:2.
  338. +9:+1:8.
  339. +99:+1:98.
  340. +999:+1:998.
  341. +9999:+1:9998.
  342. +99999:+1:99998.
  343. +999999:+1:999998.
  344. +9999999:+1:9999998.
  345. +99999999:+1:99999998.
  346. +999999999:+1:999999998.
  347. +9999999999:+1:9999999998.
  348. +99999999999:+1:99999999998.
  349. +10:-1:11.
  350. +100:-1:101.
  351. +1000:-1:1001.
  352. +10000:-1:10001.
  353. +100000:-1:100001.
  354. +1000000:-1:1000001.
  355. +10000000:-1:10000001.
  356. +100000000:-1:100000001.
  357. +1000000000:-1:1000000001.
  358. +10000000000:-1:10000000001.
  359. +123456789:+987654321:-864197532.
  360. -123456789:+987654321:-1111111110.
  361. -123456789:-987654321:864197532.
  362. +123456789:-987654321:1111111110.
  363. &fmul
  364. abc:abc:NaN.
  365. abc:+0:NaN.
  366. +0:abc:NaN.
  367. +0:+0:0.
  368. +0:+1:0.
  369. +1:+0:0.
  370. +0:-1:0.
  371. -1:+0:0.
  372. +123456789123456789:+0:0.
  373. +0:+123456789123456789:0.
  374. -1:-1:1.
  375. -1:+1:-1.
  376. +1:-1:-1.
  377. +1:+1:1.
  378. +2:+3:6.
  379. -2:+3:-6.
  380. +2:-3:-6.
  381. -2:-3:6.
  382. +111:+111:12321.
  383. +10101:+10101:102030201.
  384. +1001001:+1001001:1002003002001.
  385. +100010001:+100010001:10002000300020001.
  386. +10000100001:+10000100001:100002000030000200001.
  387. +11111111111:+9:99999999999.
  388. +22222222222:+9:199999999998.
  389. +33333333333:+9:299999999997.
  390. +44444444444:+9:399999999996.
  391. +55555555555:+9:499999999995.
  392. +66666666666:+9:599999999994.
  393. +77777777777:+9:699999999993.
  394. +88888888888:+9:799999999992.
  395. +99999999999:+9:899999999991.
  396. &fdiv
  397. abc:abc:NaN.
  398. abc:+1:abc:NaN.
  399. +1:abc:NaN.
  400. +0:+0:NaN.
  401. +0:+1:0.
  402. +1:+0:NaN.
  403. +0:-1:0.
  404. -1:+0:NaN.
  405. +1:+1:1.
  406. -1:-1:1.
  407. +1:-1:-1.
  408. -1:+1:-1.
  409. +1:+2:.5
  410. +2:+1:2.
  411. +10:+5:2.
  412. +100:+4:25.
  413. +1000:+8:125.
  414. +10000:+16:625.
  415. +10000:-16:-625.
  416. +999999999999:+9:111111111111.
  417. +999999999999:+99:10101010101.
  418. +999999999999:+999:1001001001.
  419. +999999999999:+9999:100010001.
  420. +999999999999999:+99999:10000100001.
  421. +1000000000:+9:111111111.1111111111111111111111111111111
  422. +2000000000:+9:222222222.2222222222222222222222222222222
  423. +3000000000:+9:333333333.3333333333333333333333333333333
  424. +4000000000:+9:444444444.4444444444444444444444444444444
  425. +5000000000:+9:555555555.5555555555555555555555555555556
  426. +6000000000:+9:666666666.6666666666666666666666666666667
  427. +7000000000:+9:777777777.7777777777777777777777777777778
  428. +8000000000:+9:888888888.8888888888888888888888888888889
  429. +9000000000:+9:1000000000.
  430. +35500000:+113:314159.2920353982300884955752212389380531
  431. +71000000:+226:314159.2920353982300884955752212389380531
  432. +106500000:+339:314159.2920353982300884955752212389380531
  433. +1000000000:+3:333333333.3333333333333333333333333333333
  434. $Math::BigFloat::div_scale = 20
  435. +1000000000:+9:111111111.11111111111
  436. +2000000000:+9:222222222.22222222222
  437. +3000000000:+9:333333333.33333333333
  438. +4000000000:+9:444444444.44444444444
  439. +5000000000:+9:555555555.55555555556
  440. +6000000000:+9:666666666.66666666667
  441. +7000000000:+9:777777777.77777777778
  442. +8000000000:+9:888888888.88888888889
  443. +9000000000:+9:1000000000.
  444. +35500000:+113:314159.292035398230088
  445. +71000000:+226:314159.292035398230088
  446. +106500000:+339:314159.29203539823009
  447. +1000000000:+3:333333333.33333333333
  448. $Math::BigFloat::div_scale = 40
  449. &fsqrt
  450. +0:0
  451. -1:/^(?i:0|\?|NaNQ?)$
  452. -2:/^(?i:0|\?|NaNQ?)$
  453. -16:/^(?i:0|\?|NaNQ?)$
  454. -123.456:/^(?i:0|\?|NaNQ?)$
  455. +1:1.
  456. +1.44:1.2
  457. +2:1.41421356237309504880168872420969807857
  458. +4:2.
  459. +16:4.
  460. +100:10.
  461. +123.456:11.11107555549866648462149404118219234119
  462. +15241.383936:123.456
  463.