general_2.t 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. plan tests => 663;
  7. {
  8. use Math::AnyNum;
  9. my $q = Math::AnyNum->new_q('2');
  10. my $z = Math::AnyNum->new_z('3');
  11. my $f = Math::AnyNum->new_f('4');
  12. my $c = Math::AnyNum->new_c('5');
  13. is($q->numify, 2);
  14. is((-$q)->numify, -2);
  15. is($z->numify, 3);
  16. is((-$z)->numify, -3);
  17. is($f->numify, 4);
  18. is((-$f)->numify, -4);
  19. is($c->numify, 5);
  20. is((-$c)->numify, -5);
  21. is(($q + '1/2')->numify, '2.5');
  22. is(('1/2' - $q)->numify, '-1.5');
  23. is(($z + 0.5)->numify, '3.5');
  24. is((0.5 - $z)->numify, '-2.5');
  25. is(($f + 0.5)->numify, '4.5');
  26. is((0.5 - $f)->numify, '-3.5');
  27. is(($c + 0.5)->numify, '5.5');
  28. is((0.5 - $c)->numify, '-4.5');
  29. ok($q == 2);
  30. ok($z == 3);
  31. ok($f == 4);
  32. ok($c == 5);
  33. ok(not $q != 2);
  34. ok(not $z != 3);
  35. ok(not $f != 4);
  36. ok(not $c != 5);
  37. is($q, 2);
  38. is($z, 3);
  39. is($f, 4);
  40. is($c, 5);
  41. is(ref($$q), 'Math::GMPq');
  42. is(ref($$z), 'Math::GMPz');
  43. is(ref($$f), 'Math::MPFR');
  44. is(ref($$c), 'Math::MPC');
  45. #
  46. ## Addition
  47. #
  48. is($q + $q, 4);
  49. is($q + $z, 5);
  50. is($q + $f, 6);
  51. is($q + $c, 7);
  52. is($z + $q, 5);
  53. is($z + $z, 6);
  54. is($z + $f, 7);
  55. is($z + $c, 8);
  56. is($f + $q, 6);
  57. is($f + $z, 7);
  58. is($f + $f, 8);
  59. is($f + $c, 9);
  60. is($c + $q, 7);
  61. is($c + $z, 8);
  62. is($c + $f, 9);
  63. is($c + $c, 10);
  64. #
  65. ## Subtraction
  66. #
  67. is($q - $q, 0);
  68. is($q - $z, -1);
  69. is($q - $f, -2);
  70. is($q - $c, -3);
  71. is($z - $q, 1);
  72. is($z - $z, 0);
  73. is($z - $f, -1);
  74. is($z - $c, -2);
  75. is($f - $q, 2);
  76. is($f - $z, 1);
  77. is($f - $f, 0);
  78. is($f - $c, -1);
  79. is($c - $q, 3);
  80. is($c - $z, 2);
  81. is($c - $f, 1);
  82. is($c - $c, 0);
  83. #
  84. ## Subtraction (Scalar - AnyNum)
  85. #
  86. is(5 - $q, 3);
  87. is(3.5 - $q, 1.5);
  88. is((-4) - $q, -6);
  89. is(6 - $z, 3);
  90. is(4.5 - $z, 1.5);
  91. is((-5) - $z, -8);
  92. is(7 - $f, 3);
  93. is(5.5 - $f, 1.5);
  94. is((-6) - $f, -10);
  95. is(8 - $c, 3);
  96. is(6.5 - $c, 1.5);
  97. is((-7) - $c, -12);
  98. is(-1 - Math::AnyNum->new_si(-5), 4);
  99. is(1 - Math::AnyNum->new_si(-5), 6);
  100. is(-1 - Math::AnyNum->new_si(5), -6);
  101. is(1 - Math::AnyNum->new_si(5), -4);
  102. is(-1 - Math::AnyNum->new_q(-5), 4);
  103. is(1 - Math::AnyNum->new_q(-5), 6);
  104. is(-1 - Math::AnyNum->new_q(5), -6);
  105. is(1 - Math::AnyNum->new_q(5), -4);
  106. is(-1 - Math::AnyNum->new_f(-5), 4);
  107. is(1 - Math::AnyNum->new_f(-5), 6);
  108. is(-1 - Math::AnyNum->new_f(5), -6);
  109. is(1 - Math::AnyNum->new_f(5), -4);
  110. is(-1 - Math::AnyNum->new_c(-5), 4);
  111. is(1 - Math::AnyNum->new_c(-5), 6);
  112. is(-1 - Math::AnyNum->new_c(5), -6);
  113. is(1 - Math::AnyNum->new_c(5), -4);
  114. is(-1 + Math::AnyNum->new(-5), -6);
  115. is(1 + Math::AnyNum->new(-5), -4);
  116. is(-1 + Math::AnyNum->new(5), 4);
  117. is(1 + Math::AnyNum->new(5), 6);
  118. #
  119. ## Division (Scalar / AnyNum)
  120. #
  121. is(0 / $q, 0);
  122. is(-1 / $q, -($q->inv));
  123. is(42 / $q, 21);
  124. is(1 / Math::AnyNum->new_q('4/3'), '3/4');
  125. is(-1 / Math::AnyNum->new_q('4/3'), '-3/4');
  126. is(42 / Math::AnyNum->new_q('4/3'), '63/2');
  127. is(-42 / Math::AnyNum->new_q('4/3'), '-63/2');
  128. is(-13 / Math::AnyNum->new_q('-4/3'), '39/4');
  129. is(13 / Math::AnyNum->new_q('-4/3'), '-39/4');
  130. is(12 / $z, 4);
  131. is(-12 / $z, -4);
  132. is(1 / $z, $z->inv);
  133. is(-1 / $z, -($z->inv));
  134. is(1 / $c, $c->inv);
  135. is(-1 / $c, -($c->inv));
  136. is(3 / Math::AnyNum->new_si('-5'), '-3/5');
  137. is(-3 / Math::AnyNum->new_si('-5'), '3/5');
  138. is(3 / Math::AnyNum->new_q(0), 'Inf');
  139. is(-3 / Math::AnyNum->new_q(0), '-Inf');
  140. is(3 / Math::AnyNum->new_ui(0), 'Inf');
  141. is(-3 / Math::AnyNum->new_ui(0), '-Inf');
  142. is(3 / Math::AnyNum->new_f(0), 'Inf');
  143. is(-3 / Math::AnyNum->new_f(0), '-Inf');
  144. is(3 / Math::AnyNum->new_c(0), Math::AnyNum->new_z('3') / Math::AnyNum->new_c(0));
  145. is(-3 / Math::AnyNum->new_c(0), Math::AnyNum->new_z('-3') / Math::AnyNum->new_c(0));
  146. is(23 / Math::AnyNum->new_c('3', '4'), '2.76-3.68i');
  147. is(-23 / Math::AnyNum->new_c('3', '4'), '-2.76+3.68i');
  148. is(-13 / Math::AnyNum->new_c('-3', '-4'), '1.56-2.08i');
  149. is(-13 / Math::AnyNum->new_c('-3', '4'), '1.56+2.08i');
  150. is(-13 / Math::AnyNum->new_c('3', '-4'), '-1.56-2.08i');
  151. is(13 / Math::AnyNum->new_c('-3', '-4'), '-1.56+2.08i');
  152. is(13 / Math::AnyNum->new_c('-3', '4'), '-1.56-2.08i');
  153. is(13 / Math::AnyNum->new_c('3', '-4'), '1.56+2.08i');
  154. is(0 / Math::AnyNum->new_ui(0), 'NaN');
  155. is(0 / Math::AnyNum->new_f(0), 'NaN');
  156. is(0 / Math::AnyNum->new_f('-0'), 'NaN');
  157. is(0 / Math::AnyNum->new_c('0'), Math::AnyNum->new_ui(0) / Math::AnyNum->new_c('0'));
  158. is(0 / Math::AnyNum->new_c('-0'), Math::AnyNum->new_ui(0) / Math::AnyNum->new_c('-0'));
  159. #
  160. ## Multiplication
  161. #
  162. is($q * $q, 4);
  163. is($q * $z, 6);
  164. is($q * $f, 8);
  165. is($q * $c, 10);
  166. is($z * $q, 6);
  167. is($z * $z, 9);
  168. is($z * $f, 12);
  169. is($z * $c, 15);
  170. is($f * $q, 8);
  171. is($f * $z, 12);
  172. is($f * $f, 16);
  173. is($f * $c, 20);
  174. is($c * $q, 10);
  175. is($c * $z, 15);
  176. is($c * $f, 20);
  177. is($c * $c, 25);
  178. #
  179. ## Division
  180. #
  181. is($q / $q, 1);
  182. is($q / $z, '2/3');
  183. is($q / $f, '0.5');
  184. is($q / $c, '0.4');
  185. is($z / $q, '3/2');
  186. is($z / $z, 1);
  187. is($z / $f, '0.75');
  188. is($z / $c, '0.6');
  189. is($f / $q, 2);
  190. like($f / $z, qr/^1\.333333333333333333333333333*\z/);
  191. is($f / $f, 1);
  192. is($f / $c, '0.8');
  193. is($c / $q, '2.5');
  194. like($c / $z, qr/^1\.66666666666666666666666666\d*\z/);
  195. is($c / $f, '1.25');
  196. is($c / $c, 1);
  197. #
  198. ## Division (Scalar / AnyNum)
  199. #
  200. is(16 / $q, 8);
  201. is(15 / $q, '15/2');
  202. is(4.5 / $q, 2.25);
  203. is((-8) / $q, -4);
  204. is(18 / $z, 6);
  205. is(14 / $z, '14/3');
  206. is(4.5 / $z, 1.5);
  207. is((-27) / $z, -9);
  208. is(16 / $f, 4);
  209. is(15 / $f, 3.75);
  210. is(4.5 / $f, 1.125);
  211. is((-42) / $f, -10.5);
  212. is(20 / $c, 4);
  213. is(14 / $c, 2.8);
  214. is(13.5 / $c, 2.7);
  215. is((-42) / $c, -8.4);
  216. #
  217. ## mpq [+, -] mpz
  218. #
  219. is(Math::AnyNum->new_q('5/12') + Math::AnyNum->new_z('100'), '1205/12');
  220. is(Math::AnyNum->new_q('5/12') - Math::AnyNum->new_z('100'), '-1195/12');
  221. is(Math::AnyNum->new_z('100') + Math::AnyNum->new_q('5/12'), '1205/12');
  222. is(Math::AnyNum->new_z('100') - Math::AnyNum->new_q('5/12'), '1195/12');
  223. #
  224. ## mpq [*, /] mpz
  225. #
  226. is(Math::AnyNum->new_q('5/12') * Math::AnyNum->new_z('100'), '125/3');
  227. is(Math::AnyNum->new_q('5/12') / Math::AnyNum->new_z('42'), '5/504');
  228. is(Math::AnyNum->new_z('100') * Math::AnyNum->new_q('5/12'), '125/3');
  229. is(Math::AnyNum->new_z('42') / Math::AnyNum->new_q('5/12'), '504/5');
  230. #
  231. ## Negation
  232. #
  233. is(-$q, -2);
  234. is(-$z, -3);
  235. is(-$f, -4);
  236. is(-$c, -5);
  237. # Division by zero
  238. is($q / 0, 'Inf');
  239. is($z / 0, 'Inf');
  240. is($f / 0, 'Inf');
  241. is($c / 0, 'Inf+NaNi');
  242. is(-$q / 0, '-Inf');
  243. is(-$z / 0, '-Inf');
  244. is(-$f / 0, '-Inf');
  245. is(-$c / 0, '-Inf+NaNi');
  246. #
  247. ## Square root
  248. #
  249. like(sqrt($q), qr/^1\.414213562373095048\d*\z/);
  250. like(sqrt($z), qr/^1\.732050807568877293527446\d*\z/);
  251. is(sqrt($f), '2');
  252. like(sqrt($c), qr/^2\.2360679774997896964091736\d*\z/);
  253. #
  254. ## Complex square root
  255. #
  256. like(sqrt(-$q), qr/^1\.414213562373095048\d*i\z/);
  257. like(sqrt(-$z), qr/^1\.732050807568877293\d*i\z/);
  258. is(sqrt(-$f), '2i');
  259. like(sqrt(-$c), qr/^-2\.2360679774997896964091736\d*i\z/);
  260. #
  261. ## Power
  262. #
  263. is($q**$q, 4);
  264. is($q**$z, 8);
  265. is($q**$f, 16);
  266. is($q**$c, 32);
  267. is($z**$q, 9);
  268. is($z**$z, 27);
  269. is($z**$f, 81);
  270. is($z**$c, 243);
  271. is($f**$q, 16);
  272. is($f**$z, 64);
  273. is($f**$f, 256);
  274. is($f**$c, 1024);
  275. is($c**$q, 25);
  276. is($c**$z, 125);
  277. is($c**$f, 625);
  278. is($c**$c, 3125);
  279. #<<<
  280. like(Math::AnyNum->new('-1.2') ** Math::AnyNum->new('3.4'),
  281. qr/^-0\.5743790627709710900290932\d*-1\.767756985588369210401232327481\d*i\z/);
  282. #>>>
  283. like((-$z)**(1 / $q), qr/^1\.7320508075688772935274463415058723669\d*i\z/);
  284. like((-$q)**(-1 / $q), qr/^-0\.70710678118654752440084436210484903928\d*i\z/);
  285. like((-$q)**(-1 / $z), qr/^0\.39685026299204986868792640981\d*-0\.6873648184993013131917395984430\d*i\z/);
  286. is((-$z)**(-$q), '1/9');
  287. is((-$q)**(-$z), '-1/8');
  288. is((-$q)**$z, '-8');
  289. is((-2)**$z, '-8');
  290. is((-$z)**$q, '9');
  291. is((1 / $q)**$z, '1/8');
  292. is((-$z)**$z, '-27');
  293. is((-$z)**2, '9');
  294. like($z**(1 / $q), qr/^1\.732050807568877293527446\d*\z/);
  295. like($q**(1 / $q), qr/^1\.4142135623730950488016887\d*\z/);
  296. like($q**(-1 / $f), qr/^0\.8408964152537145430311254762\d*\z/);
  297. like($z**(-1 / $f), qr/^0\.7598356856515925473311877506\d*\z/);
  298. like((-$z)**(-1 / $f), qr/^0\.537284965911770959776669078352965\d*-0\.53728496591177095977666907835296\d*i\z/);
  299. like((-$q)**(-1 / $f), qr/^0\.5946035575013605333587499852\d*\-0\.59460355750136053335874998528023\d*i\z/);
  300. like((-$q)**(1 / $f), qr/^0\.8408964152537145430311254762332\d*\+0\.840896415253714543031125\d*i\z/);
  301. is(ref(${(-$f)**$f}), 'Math::MPFR');
  302. is(ref(${(-$f)**(1 / $f)}), 'Math::MPC');
  303. is((-$f)**$f, 256);
  304. is((-$f)**(1 / $q), '2i');
  305. is((-$f)**(1 / $f), '1+i');
  306. is((-$f)**(-1 / $f), '0.5-0.5i');
  307. like((-$f)**(1 / $z), qr/^0\.79370052598409973737585\d*\+1\.37472963699860262638347919\d*i\z/);
  308. #
  309. ## Natural exponentiation
  310. #
  311. like(exp(Math::AnyNum->pi * Math::AnyNum->i)->real->zeta, qr/^-0\.083333333333333333333333333\d*\z/);
  312. #
  313. ## MPC to MPFR
  314. #
  315. like((($z + $f * sqrt($q - $z)) - sqrt(-$z + $q) * $f)->zeta, qr/^1\.202056903159594285399738161511449\d*\z/);
  316. like((($z + $f * sqrt($q - $z)) - sqrt(-$z + $q) * ($c - 1))->zeta, qr/^1\.202056903159594285399738161511449\d*\z/);
  317. like((($z + $f * sqrt($q - $z)) - ($z + 1) * sqrt(-$z + $q))->zeta, qr/^1\.202056903159594285399738161511449\d*\z/);
  318. like((($z + $f * sqrt($q - $z)) - sqrt(-$z + $q) * ($z + 1))->zeta, qr/^1\.202056903159594285399738161511449\d*\z/);
  319. like((($z + $f * sqrt($q - $z)) - sqrt(-$z + $q) * ($q + 2))->zeta, qr/^1\.202056903159594285399738161511449\d*\z/);
  320. is(($z + $q * sqrt($q - $z))->real, $z);
  321. is(($z + $q * sqrt($q - $z))->imag, $q);
  322. is(($q + $z * sqrt($q - $z))->real, $q);
  323. is(($q + $z * sqrt($q - $z))->imag, $z);
  324. #
  325. ## zeta
  326. #
  327. like($q->zeta, qr/^1\.64493406684822643647\d*\z/);
  328. like($z->zeta, qr/^1\.20205690315959428\d*\z/);
  329. like($f->zeta, qr/^1\.0823232337111381915160\d*\z/);
  330. like($c->zeta, qr/^1\.03692775514336992633136\d*\z/);
  331. #
  332. ## Equality
  333. #
  334. ok($q == $q);
  335. ok($z == $z);
  336. ok($f == $f);
  337. ok($c == $c);
  338. ok($q == sqrt($q * $q));
  339. ok($z == sqrt($z * $z));
  340. ok($f == sqrt($f * $f));
  341. ok($c == sqrt($c * $c));
  342. ok(sqrt($q * $q) == $q);
  343. ok(sqrt($z * $z) == $z);
  344. ok(sqrt($f * $f) == $f);
  345. ok(sqrt($c * $c) == $c);
  346. ok($q * $f == $f * $q);
  347. ok($q * $z == $z * $q);
  348. ok($q * $c == $c * $q);
  349. ok($z * $f == $f * $z);
  350. ok($z * $c == $c * $z);
  351. ok($f * $c == $c * $f);
  352. ok(!($q * $f != $f * $q));
  353. ok(!($q * $z != $z * $q));
  354. ok(!($q * $c != $c * $q));
  355. ok(!($z * $f != $f * $z));
  356. ok(!($z * $c != $c * $z));
  357. ok(!($f * $c != $c * $f));
  358. ok(!($q != $q));
  359. ok(!($z != $z));
  360. ok(!($f != $f));
  361. ok(!($c != $c));
  362. ok(!($z == $q));
  363. ok(!($z == $f));
  364. ok(!($z == $c));
  365. ok(!($q == $z));
  366. ok(!($q == $f));
  367. ok(!($q == $c));
  368. ok(!($f == $z));
  369. ok(!($f == $q));
  370. ok(!($f == $c));
  371. ok(!($c == $z));
  372. ok(!($c == $f));
  373. ok(!($c == $q));
  374. #
  375. ## Inequality
  376. #
  377. ok($q != $z);
  378. ok($q != $f);
  379. ok($q != $c);
  380. ok($z != $q);
  381. ok($z != $f);
  382. ok($z != $c);
  383. ok($f != $q);
  384. ok($f != $z);
  385. ok($f != $c);
  386. ok($c != $q);
  387. ok($c != $z);
  388. ok($c != $f);
  389. #
  390. ## Comparisons
  391. #
  392. is($q * $f <=> $f * $q, 0);
  393. is($q * $z <=> $z * $q, 0);
  394. is($z * $f <=> $f * $z, 0);
  395. is($c * $f <=> $f * $c, 0);
  396. is($q <=> 3, -1);
  397. is($q <=> 2, 0);
  398. is($q <=> 1, 1);
  399. is($c <=> 7, -1);
  400. is($c <=> 5, 0);
  401. is($c <=> 2, 1);
  402. is(3 <=> $q, 1);
  403. is(2 <=> $q, 0);
  404. is(1 <=> $q, -1);
  405. is(2 <=> $c, -1);
  406. is(5 <=> $c, 0);
  407. is(7 <=> $c, 1);
  408. is($f <=> 5, -1);
  409. is($f <=> 4, 0);
  410. is($f <=> 3, 1);
  411. ok(5 > $f);
  412. ok(4 >= $f);
  413. ok(4 <= $f);
  414. ok(4 == $f);
  415. ok($f == 4);
  416. ok($f > 3);
  417. ok(!($f > 6));
  418. ok($f > 2.5);
  419. ok($f >= 2.5);
  420. ok($f < 4.5);
  421. ok($f <= 4.5);
  422. ok(5 >= $c);
  423. ok(5 <= $c);
  424. ok(6 > $c);
  425. ok(4 < $c);
  426. ok($c > 4);
  427. ok($c < 6);
  428. is($z <=> $q, +1);
  429. is($q <=> $z, -1);
  430. is($f <=> $z, 1);
  431. is($z <=> $f, -1);
  432. ok($f > $q);
  433. ok($f > $z);
  434. ok($f >= $f);
  435. ok($f <= $f);
  436. ok($z > $q);
  437. ok($z >= $z);
  438. ok($z <= $z);
  439. ok($z < $f);
  440. ok($q < $z);
  441. ok($q >= $q);
  442. ok($q <= $q);
  443. ok($q < $f);
  444. #
  445. ## Scalar
  446. #
  447. is($q + (-7), '-5');
  448. is($q + (7), '9');
  449. is($z + (-7), '-4');
  450. is($z + (7), '10');
  451. is($f + (-7), '-3');
  452. is($f + (7), '11');
  453. is($c + (-7), '-2');
  454. is($c + (7), '12');
  455. is($q - (-7), '9');
  456. is($q - (7), '-5');
  457. is($z - (-7), '10');
  458. is($z - (7), '-4');
  459. is($f - (-7), '11');
  460. is($f - (7), '-3');
  461. is($c - (-7), '12');
  462. is($c - (7), '-2');
  463. is($q * (-7), '-14');
  464. is($q * (7), '14');
  465. is($z * (-7), '-21');
  466. is($z * (7), '21');
  467. is($f * (-7), '-28');
  468. is($f * (7), '28');
  469. is($c * (-7), '-35');
  470. is($c * (7), '35');
  471. is($q / (-7), '-2/7');
  472. is($q / (7), '2/7');
  473. is($z / (-7), '-3/7');
  474. is($z / (7), '3/7');
  475. like($f / (-7), qr/^-0\.57142857142857142857142\d*\z/);
  476. like($f / (7), qr/^0\.57142857142857142857142\d*\z/);
  477. like($c / (-7), qr/^-0\.714285714285714285714\d*\z/);
  478. like($c / (7), qr/^0\.714285714285714285714\d*\z/);
  479. # With common factors
  480. is($q / (2), '1');
  481. is($q / (-2), '-1');
  482. is(($q * 26) / (13), '4');
  483. is((26 * $q) / (-13), '-4');
  484. is($q / (-2), '-1');
  485. is($z / (3), '1');
  486. is($z / (-3), '-1');
  487. is(($z * 10) / 5, '6');
  488. is((10 * $z) / (-5), '-6');
  489. #
  490. ## Scalar power
  491. #
  492. is($q**7, '128');
  493. is($q**(-7), '1/128');
  494. is($q**6, '64');
  495. is((-$q)**(7), '-128');
  496. is((-$q)**(6), '64');
  497. is((-$q)**(-6), '1/64');
  498. is((-$q)**(-7), '-1/128');
  499. is($z**7, '2187');
  500. is($z**(-7), '1/2187');
  501. is($z**6, '729');
  502. is((-$z)**6, '729');
  503. is((-$z)**(-7), '-1/2187');
  504. is((-$z)**(-6), '1/729');
  505. is((-$z)**7, '-2187');
  506. is($f**7, '16384');
  507. is($f**(-7), '0.00006103515625');
  508. is($f**6, '4096');
  509. is((-$f)**6, '4096');
  510. is((-$f)**(-7), '-0.00006103515625');
  511. is((-$f)**(-6), '0.000244140625');
  512. is((-$f)**7, '-16384');
  513. is($c**7, '78125');
  514. is($c**(-7), '0.0000128');
  515. is($c**6, '15625');
  516. is((-$c)**6, '15625');
  517. is((-$c)**(-7), '-0.0000128');
  518. is((-$c)**(-6), '0.000064');
  519. is((-$c)**7, '-78125');
  520. is($z + 'abc', 'NaN');
  521. is($z + 'a.bc', 'NaN');
  522. is($f**'a.bc', 'NaN');
  523. is($f**'abc', 'NaN');
  524. is($q**'123ez', 'NaN');
  525. is($c**'123e.z', 'NaN+NaNi');
  526. is($q + '89123891263487912648128462184612836', '89123891263487912648128462184612838');
  527. is($z + '89123891263487912648128462184612836', '89123891263487912648128462184612839');
  528. is($f + '89123891263487912648128462184612836', '89123891263487912648128462184612840');
  529. is($c + '89123891263487912648128462184612836', '89123891263487912648128462184612841');
  530. is($q - '89123891263487912648128462184612836', '-89123891263487912648128462184612834');
  531. is($z - '89123891263487912648128462184612836', '-89123891263487912648128462184612833');
  532. is($f - '89123891263487912648128462184612836', '-89123891263487912648128462184612832');
  533. is($c - '89123891263487912648128462184612836', '-89123891263487912648128462184612831');
  534. is($q * '89123891263487912648128462184612836', '178247782526975825296256924369225672');
  535. is($z * '89123891263487912648128462184612836', '267371673790463737944385386553838508');
  536. is($f * '89123891263487912648128462184612836', '356495565053951650592513848738451344');
  537. is($c * '89123891263487912648128462184612836', '445619456317439563240642310923064180');
  538. is($q / '89123891263487912648128462184612836', '1/44561945631743956324064231092306418');
  539. is($z / '89123891263487912648128462184612836', '3/89123891263487912648128462184612836');
  540. is(($f / '89123891263487912648128462184612836')**(-1), '22280972815871978162032115546153209');
  541. is(($c / '89123891263487912648128462184612836')**(-1), '17824778252697582529625692436922567.2');
  542. #
  543. ## Natural logarithm
  544. #
  545. like(log($q), qr/^0\.69314718055994530941723212145817\d*\z/);
  546. like(log(-$q), qr/^0\.6931471805599453094172321214581765\d*\+3\.1415926535897932384626433832795028841\d*i\z/);
  547. like(log($z), qr/^1\.098612288668109691395245236922525704\d*\z/);
  548. like(log(-$z), qr/^1\.09861228866810969139524523692252570\d*\+3\.14159265358979323846264338327\d*i\z/);
  549. like($f->log, qr/^1\.38629436111989061883446424291\d*\z/);
  550. like($c->log, qr/^1\.6094379124341003746007593332\d*\z/);
  551. like($c->log(3), qr/^1\.46497352071792716719704040\d*\z/);
  552. like($f->log(3), qr/^1\.261859507142914874199054228\d*\z/);
  553. like($z->log(5), qr/^0\.682606194485985295134566359271052253\d*\z/);
  554. is($z->log($z), 1);
  555. is($q->log($q), 1);
  556. is($f->log($f), 1);
  557. is($c->log($c), 1);
  558. like($z->log($q), qr/^1\.5849625007211561814537\d*\z/);
  559. like($q->log($z), qr/^0\.6309297535714574370995271\d*\z/);
  560. is($q->log2, 1);
  561. like($z->log2, qr/^1\.5849625007211561814537389\d*\z/);
  562. is($f->log2, 2);
  563. like($c->log2, qr/^2\.3219280948873623478703194294\d*\z/);
  564. like($q->log10, qr/^0\.3010299956639811952137\d*\z/);
  565. like($z->log10, qr/^0\.47712125471966243729502\d*\z/);
  566. like($f->log10, qr/^0\.60205999132796239042747\d*\z/);
  567. like($c->log10, qr/^0\.69897000433601880478626110527\d*\z/);
  568. is(Math::AnyNum->new(), '0');
  569. is(Math::AnyNum->new(''), '0');
  570. is(Math::AnyNum->new(undef), '0');
  571. is(Math::AnyNum->new(undef, 10), '0');
  572. is(Math::AnyNum->new(undef, 36), '0');
  573. my $NaN = Math::AnyNum->nan;
  574. my $Inf = Math::AnyNum->inf;
  575. ok($z != $NaN);
  576. ok($q != $NaN);
  577. ok($f != $NaN);
  578. ok($c != $NaN);
  579. ok($NaN != $z);
  580. ok($NaN != $q);
  581. ok($NaN != $f);
  582. ok($NaN != $c);
  583. ok($z != $Inf);
  584. ok($q != $Inf);
  585. ok($f != $Inf);
  586. ok($c != $Inf);
  587. ok($Inf != $z);
  588. ok($Inf != $q);
  589. ok($Inf != $f);
  590. ok($Inf != $c);
  591. ok(not $z == $NaN);
  592. ok(not $q == $NaN);
  593. ok(not $f == $NaN);
  594. ok(not $c == $NaN);
  595. ok(not $z == $Inf);
  596. ok(not $q == $Inf);
  597. ok(not $f == $Inf);
  598. ok(not $c == $Inf);
  599. ok(not $NaN == $z);
  600. ok(not $NaN == $q);
  601. ok(not $NaN == $f);
  602. ok(not $NaN == $c);
  603. ok(not $Inf == $z);
  604. ok(not $Inf == $q);
  605. ok(not $Inf == $f);
  606. ok(not $Inf == $c);
  607. ok(not $NaN == 2);
  608. ok(not $Inf == 2);
  609. ok($NaN != 2);
  610. ok($Inf != 2);
  611. ok($Inf->is_inf);
  612. ok((-$Inf)->is_ninf);
  613. ok($NaN->is_nan);
  614. ok(not $NaN->is_inf);
  615. ok(not $NaN->is_ninf);
  616. ok(not $Inf->is_nan);
  617. ok(not $Inf->is_ninf);
  618. ok(not((-$Inf)->is_inf));
  619. ok(not((-$Inf)->is_nan));
  620. ok(2 != $NaN);
  621. ok(2 != $Inf);
  622. ok(not 2 == $NaN);
  623. ok(not 2 == $Inf);
  624. ok(not $NaN == 0);
  625. ok(not 0 == $NaN);
  626. ok($NaN != 0);
  627. ok(0 != $NaN);
  628. my $zero = Math::AnyNum->zero;
  629. ok(not $NaN == $zero);
  630. ok(not $zero == $NaN);
  631. ok($NaN != $zero);
  632. ok($zero != $NaN);
  633. ok(not defined($NaN <=> 42));
  634. ok(not defined($NaN <=> Math::AnyNum->new_f(42)));
  635. ok(not defined(Math::AnyNum->new_f(42) <=> $NaN));
  636. ok(not defined(42 <=> $NaN));
  637. my $NaN_NaN = Math::AnyNum->new_c("NaN", "NaN");
  638. ok(not defined($NaN_NaN <=> 42));
  639. ok(not defined(42 <=> $NaN_NaN));
  640. ok(not defined($NaN_NaN <=> $NaN_NaN));
  641. ok(not defined($NaN <=> $NaN_NaN));
  642. ok(not defined($NaN_NaN <=> $NaN));
  643. ok(not $NaN == $NaN);
  644. ok(not $NaN == $NaN_NaN);
  645. ok(not $NaN_NaN == $NaN_NaN);
  646. ok(not $NaN_NaN == $NaN);
  647. ok($NaN_NaN != $Inf);
  648. ok(not $NaN_NaN == $Inf);
  649. ok($NaN != $NaN);
  650. ok($NaN != $NaN_NaN);
  651. ok($NaN_NaN != $NaN_NaN);
  652. ok($NaN_NaN != $NaN);
  653. ok(not defined(42 < $NaN));
  654. ok(not defined(42 > $NaN));
  655. ok(not defined(42 <= $NaN));
  656. ok(not defined(42 >= $NaN));
  657. ok(not defined($NaN < 42));
  658. ok(not defined($NaN > 42));
  659. ok(not defined($NaN <= 42));
  660. ok(not defined($NaN >= 42));
  661. ok(not defined(42 < $NaN_NaN));
  662. ok(not defined(42 > $NaN_NaN));
  663. ok(not defined(42 <= $NaN_NaN));
  664. ok(not defined(42 >= $NaN_NaN));
  665. ok(not defined($NaN_NaN < 42));
  666. ok(not defined($NaN_NaN > 42));
  667. ok(not defined($NaN_NaN <= 42));
  668. ok(not defined($NaN_NaN >= 42));
  669. ok(not defined($NaN < $NaN));
  670. ok(not defined($NaN > $NaN));
  671. ok(not defined($NaN <= $NaN));
  672. ok(not defined($NaN >= $NaN));
  673. ok(not defined($NaN_NaN < $NaN));
  674. ok(not defined($NaN_NaN > $NaN));
  675. ok(not defined($NaN_NaN <= $NaN));
  676. ok(not defined($NaN_NaN >= $NaN));
  677. }
  678. {
  679. #
  680. ## Complex
  681. #
  682. my $i = Math::AnyNum->i;
  683. my $x = Math::AnyNum->new('3');
  684. my $y = Math::AnyNum->new('4');
  685. my $z = $x + $y * $i;
  686. is($z + 2, "5+4i");
  687. is($z + (-2), "1+4i");
  688. }
  689. {
  690. #
  691. ## Complex numbers in Cartesian form
  692. #
  693. my $p = Math::AnyNum->new(100);
  694. is($p + "(0.2 1/2)", '100.2+0.5i');
  695. is($p + "(0.2 0.2)", '100.2+0.2i');
  696. is($p + "(1/2 0.2)", '100.5+0.2i');
  697. is($p + "(1/2 13)", '100.5+13i');
  698. is($p + "(13 1/2)", '113+0.5i');
  699. is($p + "(-13 1/2)", '87+0.5i');
  700. is($p + "(-13 -1/2)", '87-0.5i');
  701. is($p + "(13 +1/2)", '113+0.5i');
  702. is($p + "(13 +0.2)", '113+0.2i');
  703. is($p + "(+13 0.2)", '113+0.2i');
  704. is($p + "(+13 +1/2)", '113+0.5i');
  705. is($p + "(-13 +1/2)", '87+0.5i');
  706. is($p + "(-13 -1/2)", '87-0.5i');
  707. is($p + "(1/2 1/5)", '100.5+0.2i');
  708. is($p + "(5 9)", '105+9i');
  709. is($p + "(-5 -9)", '95-9i');
  710. is($p + "(-1/5 -1/2)", '99.8-0.5i');
  711. is($p + "(3+4i 5-6i)", '109+9i');
  712. is($p + "(1/2 5+6i)", '94.5+5i');
  713. is($p + "(3 5-6i)", '109+5i');
  714. is($p + "(0.2 -5+6i)", '94.2-5i');
  715. is($p + "(5-6i 5)", '105-i');
  716. is($p + "(3+6i 5)", '103+11i');
  717. is($p + "(-3-6i -1/2)", '97-6.5i');
  718. is($p + "(-3+6i -0.5)", '97+5.5i');
  719. }
  720. {
  721. #
  722. ## Division by zero
  723. #
  724. my $z = Math::AnyNum->new_z('0');
  725. my $q = Math::AnyNum->new_q('0');
  726. my $f = Math::AnyNum->new_f('0');
  727. my $c = Math::AnyNum->new_c('0');
  728. my $nz = Math::AnyNum->new_z('13');
  729. my $nq = Math::AnyNum->new_q('13');
  730. my $nf = Math::AnyNum->new_f('13');
  731. my $nc = Math::AnyNum->new_c('13');
  732. is($nz / $z, 'Inf');
  733. is($nz / $q, 'Inf');
  734. is($nz / $f, 'Inf');
  735. is($nz / $c, 'Inf+NaNi');
  736. is($nq / $z, 'Inf');
  737. is($nq / $q, 'Inf');
  738. is($nq / $f, 'Inf');
  739. is($nq / $c, 'Inf+NaNi');
  740. is($nf / $z, 'Inf');
  741. is($nf / $q, 'Inf');
  742. is($nf / $f, 'Inf');
  743. is($nf / $c, 'Inf+NaNi');
  744. is($nc / $z, 'Inf+NaNi');
  745. is($nc / $q, 'Inf+NaNi');
  746. is($nc / $f, 'Inf+NaNi');
  747. is($nc / $c, 'Inf+NaNi');
  748. is($z / $z, 'NaN');
  749. is($z / $q, 'NaN');
  750. is($z / $f, 'NaN');
  751. is($z / $c, 'NaN+NaNi');
  752. is($q / $z, 'NaN');
  753. is($q / $q, 'NaN');
  754. is($q / $f, 'NaN');
  755. is($q / $c, 'NaN+NaNi');
  756. is($f / $z, 'NaN');
  757. is($f / $q, 'NaN');
  758. is($f / $f, 'NaN');
  759. is($f / $c, 'NaN+NaNi');
  760. is($c / $z, 'NaN+NaNi');
  761. is($c / $q, 'NaN+NaNi');
  762. is($c / $f, 'NaN+NaNi');
  763. is($c / $c, 'NaN+NaNi');
  764. }
  765. {
  766. # Lambert W
  767. like(Math::AnyNum->new('-0.35787944117144232159552377016146086744581113103177')->LambertW,
  768. qr/^-0\.7832291989812967764330746/);
  769. like(log(Math::AnyNum->new(100))->LambertW->exp, qr/^3\.59728502354041750549765/);
  770. like(Math::AnyNum->mone->LambertW, qr/^-0\.31813150520476413\d*\+1\.33723570143068\d*i\z/);
  771. like(Math::AnyNum->new(-42.5)->LambertW, qr/^2\.50845139125332570\d*\+2\.3820376343818060087\d*i\z/);
  772. like(Math::AnyNum->one->LambertW, qr/^0\.5671432904097838729999/);
  773. is(Math::AnyNum->e->LambertW, 1);
  774. }
  775. {
  776. is(Math::AnyNum->new_c(3, 4), '3+4i');
  777. is(Math::AnyNum->new_c(5), '5');
  778. is(Math::AnyNum->new_c('1e2'), '100');
  779. is(Math::AnyNum->new_c('1e2', '1e3'), '100+1000i');
  780. is(Math::AnyNum->new_c("ff", "ae", 16), '255+174i');
  781. }
  782. {
  783. # Trigonometric functions
  784. my $f = Math::AnyNum->new_f('12.3');
  785. my $c = Math::AnyNum->new_c('3.5', '5.2');
  786. like(cos($f), qr/^0\.964732617886609590915710186\d*\z/);
  787. like(sin($f), qr/^-0\.263231791365801650601707825888\d*\z/);
  788. like(cos($c), qr/\-84\.87938457391136851218282456\d*\+31\.79266348861286277038879360747474\d*i\z/);
  789. like(sin($c), qr/^-31\.79459860688613495225058132\d*\-84\.87421855026867660849447320745263\d*i\z/);
  790. }