04-inf_nan.t 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. plan(tests => 106);
  7. use Sidef;
  8. my $o = 'Sidef::Types::Number::Number';
  9. my $mone = $o->new(-1);
  10. my $zero = $o->new(0);
  11. my $one = $o->new(1);
  12. my $five = $o->new(5);
  13. my $inf = $o->inf;
  14. my $nan = $o->nan;
  15. my $ninf = $o->ninf;
  16. my $i = Sidef::Types::Number::Complex->new(0, 1);
  17. my $true = Sidef::Types::Bool::Bool::TRUE;
  18. my $false = Sidef::Types::Bool::Bool::FALSE;
  19. ##################################################
  20. # extreme
  21. is($one->div($zero), $inf);
  22. is($mone->div($zero), $ninf);
  23. is($zero->neg, $zero); # should be -0.0
  24. is($inf->add($one), $inf);
  25. is($one->sub($inf), $ninf);
  26. is($inf->mul($five), $inf);
  27. is($inf->div($five), $inf);
  28. is($five->neg->sub($inf), $ninf);
  29. is($ninf->sub($five), $ninf);
  30. is($five->neg->add($inf), $inf);
  31. is($ninf->add($five), $ninf);
  32. is($inf->add($five->neg), $inf);
  33. is($one->div($inf), $zero);
  34. is($mone->div($inf), $zero); # should be -0.0
  35. is($ninf, $mone->div($zero));
  36. is($inf->add($inf), $inf);
  37. is($inf->mul($inf), $inf);
  38. is($inf->mul($ninf), $ninf);
  39. is($ninf->mul($inf), $ninf);
  40. is($zero->lt($inf), $true);
  41. is($inf->eq($inf), $true);
  42. is($ninf->eq($ninf), $true);
  43. is($ninf->cmp($inf), $mone);
  44. is($inf->cmp($ninf), $one);
  45. is($inf->cmp($inf), $zero);
  46. is($ninf->cmp($ninf), $zero);
  47. is($zero->cmp($ninf), $one);
  48. is($nan->gt($zero), undef);
  49. is($nan->lt($zero), undef);
  50. is($nan->eq($zero), $false);
  51. is($inf->div($mone), $ninf);
  52. is($inf->abs, $inf);
  53. is($ninf->abs, $inf);
  54. is($inf->sqrt, $inf);
  55. is($inf->erfc, $zero);
  56. is(($ninf)->erfc, $o->new(2));
  57. like($o->new("-1.01")->acos, qr/^3\.141592653.*?\s*-\s*0\.14130376.*i\z/);
  58. like($o->new("1.01")->acos, qr/^-0\.1413037.*i\z/);
  59. like($o->new("-1.01")->asin, qr/^-1\.5707963.*?\s*\+\s*0\.141303769.*i\z/);
  60. like($o->new("1.01")->asin, qr/^1\.57079632.*?\s*\+\s*0\.141303769.*i\z/);
  61. is($mone->sqrt, $i);
  62. ##################################################
  63. # Root
  64. is($inf->root($o->new(-12)), $zero);
  65. is($ninf->root($o->new(-12)), $zero);
  66. is($inf->root($o->new(2)), $inf);
  67. is($inf->root($inf), $one);
  68. is($ninf->root($inf), $one);
  69. is($inf->root($ninf), $one);
  70. is($ninf->root($ninf), $one);
  71. is($ninf->root($o->new(1)), $ninf);
  72. is($ninf->root($o->new(0)), $inf);
  73. is($inf->root($o->new(1)), $inf);
  74. is($inf->root($o->new(0)), $inf);
  75. like($inf->asec, qr/^1\.5707963267/);
  76. is($one->root($mone), $one);
  77. is($one->iroot($mone), $one);
  78. is($zero->root($zero), $zero);
  79. is($zero->iroot($zero), $zero);
  80. is($zero->root($mone), $inf);
  81. is($zero->iroot($mone), $inf);
  82. is($mone->root($zero), $one);
  83. is($mone->iroot($zero), $one);
  84. is($mone->root($one), $mone);
  85. is($mone->iroot($one), $mone);
  86. my $two = $one->add($one);
  87. my $mtwo = $two->neg;
  88. is($mone->root($two), $i);
  89. is($one->root($mtwo), $one);
  90. is($one->iroot($mtwo), $one);
  91. is($mone->root($mtwo), $i->neg);
  92. is($mtwo->root($mtwo)->abs->int, $zero);
  93. is($zero->root($mone), $inf);
  94. is($zero->iroot($mone), $inf);
  95. is($two->root($mone), $one->div($two));
  96. is($two->iroot($mone), $zero);
  97. is($two->iroot($mtwo), $zero);
  98. #################################################
  99. # Pow
  100. is($inf->pow($o->new(-12)->inv), $zero);
  101. is($ninf->pow($o->new(-12)->inv), $zero);
  102. is($inf->pow($o->new(2)->inv), $inf);
  103. is($inf->pow($o->new(2)->inv), $inf);
  104. is($inf->pow($inf->inv), $one);
  105. is($ninf->pow($inf->inv), $one);
  106. is($inf->pow($ninf->inv), $one);
  107. is($ninf->pow($ninf->inv), $one);
  108. is($ninf->pow($o->new(1)->inv), $ninf);
  109. is($ninf->pow($o->new(0)->inv), $inf);
  110. is($inf->pow($o->new(1)->inv), $inf);
  111. is($inf->pow($o->new(0)->inv), $inf);
  112. ###################################################
  113. # Infinity <=> Number
  114. is($inf->gt($five), $true);
  115. ok($inf->ge($zero), $true);
  116. ok($ninf->lt($zero), $true);
  117. ok($ninf->lt($mone), $true);
  118. ok($ninf->lt($inf), $true);
  119. ok($inf->ge($ninf), $true);
  120. ok($inf->gt($ninf), $true);
  121. ok($five->lt($inf), $true);
  122. ok($five->le($inf), $true);
  123. ok($five->ge($ninf), $true);
  124. ok($five->neg->gt($ninf), $true);
  125. is($inf->cmp($inf), $zero);
  126. is($inf->cmp($ninf), $one);
  127. is($ninf->cmp($inf), $mone);
  128. is($inf->cmp($five), $one);
  129. is($ninf->cmp($five->neg), $mone);
  130. is($ninf->cmp($five), $mone);
  131. is($five->cmp($inf), $mone);
  132. is($five->cmp($ninf), $one);
  133. is($five->neg->cmp($ninf), $one);
  134. is($five->neg->cmp($inf), $mone);