trigonometry.t 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More tests => 111;
  6. use Math::AnyNum;
  7. my $o = 'Math::AnyNum';
  8. my $pi = $o->pi;
  9. my $d = $o->new(45);
  10. my $r = $pi->div($o->new(4));
  11. sub rad2deg {
  12. $o->new(180)->div($pi)->mul($_[0]);
  13. }
  14. sub deg2rad {
  15. $pi->div($o->new(180))->mul($_[0]);
  16. }
  17. like($r->sin, qr/^0\.7071067811865/);
  18. like($r->cos, qr/^0\.7071067811865/);
  19. like(deg2rad($d)->sin, qr/^0\.7071067811865/);
  20. like(deg2rad($d)->cos, qr/^0\.7071067811865/);
  21. is($r->tan, $o->new(1));
  22. is($r->cot, $o->new(1));
  23. my $asin = $r->sin->asin;
  24. is($asin, $pi->div($o->new(4)));
  25. is(rad2deg($asin), $d);
  26. my $acos = $r->cos->acos;
  27. is($acos, $pi->div($o->new(4)));
  28. is(rad2deg($acos), $d);
  29. my $atan = $r->tan->atan;
  30. is($atan, $pi->div($o->new(4)));
  31. is(rad2deg($atan), $d);
  32. my $acot = $r->cot->acot;
  33. is($acot, $pi->div($o->new(4)));
  34. is(rad2deg($acot), $d);
  35. like($o->new(1)->atan2($o->new(1))->mul($o->new(4)), qr/^3.14159/);
  36. #
  37. ## More tests
  38. #
  39. {
  40. my $x = $o->new(5);
  41. my $y = $x->inv;
  42. my $class = 'Math::AnyNum';
  43. my %tests = (
  44. asin => [[$class, qr/^1\.570796326.*?\+2\.2924[^i]*i\z/], [$class, qr/^0\.2013579207903307/],],
  45. sinh => [[$class, qr/^74\.203210577788758/], [$class, qr/^0\.2013360025410939/],],
  46. asinh => [[$class, qr/^2\.312438341272752/], [$class, qr/^0\.198690110349241/],],
  47. acos => [[$class, qr/^-2\.292431669561177[^i]*i\z/], [$class, qr/^1\.36943840600456582/],],
  48. cosh => [[$class, qr/^74\.20994852478784444/], [$class, qr/^1\.020066755619075846/],],
  49. acosh => [[$class, qr/^2\.292431669561177687/], [$class, qr/^1\.369438406004565827[^i]*i\z/],],
  50. tan => [[$class, qr/^-3\.3805150062465856369/], [$class, qr/^0\.202710035508672483321/],],
  51. atan => [[$class, qr/^1\.373400766945015860861/], [$class, qr/^0\.197395559849880758370/],],
  52. tanh => [[$class, qr/^0\.9999092042625951312109/], [$class, qr/^0\.1973753202249040007381/],],
  53. atanh => [[$class, qr/^0\.2027325540540.*?\+1\.5707963267948966[^i]*i\z/], [$class, qr/^0\.20273255405408219/],],
  54. sec => [[$class, qr/^3\.525320085816088406/], [$class, qr/^1\.020338844941192689/],],
  55. asec => [[$class, qr/^1\.36943840600456582777/], [$class, qr/^-2\.29243166956117768[^i]*i\z/],],
  56. sech => [[$class, qr/^0\.01347528222130455730/], [$class, qr/^0\.98032799764472533487/],],
  57. asech => [[$class, qr/^1\.36943840600456582777[^i]*i\z/], [$class, qr/^2\.2924316695611776878007873/],],
  58. csc => [[$class, qr/^-1\.04283521277140581978311985/], [$class, qr/^5\.033489547672344202426096367/],],
  59. acsc => [
  60. [$class, qr/^0\.2013579207903307914551255522/],
  61. [$class, qr/^1\.570796326794896619231321.*?\+2\.29243166956117768780[^i]*i\z/],
  62. ],
  63. csch => [[$class, qr/^0\.0134765058305890866553818/], [$class, qr/^4\.9668215688145168965134827/],],
  64. acsch => [[$class, qr/^0\.1986901103492414064746369/], [$class, qr/^2\.3124383412727526202535623/],],
  65. cot => [[$class, qr/^-0\.2958129155327455404277671/], [$class, qr/^4\.93315487558689365736801632/],],
  66. acot => [[$class, qr/^0\.19739555984988075837004976/], [$class, qr/^1\.37340076694501586086127192/],],
  67. coth => [[$class, qr/^1\.00009080398201937553665792/], [$class, qr/^5\.06648956343947271363178778/],],
  68. acoth => [[$class, qr/^0\.202732554054082190989006557/],
  69. [$class, qr/^0\.2027325540540821909.*?\+1\.5707963267948966192[^i]*i/],
  70. ],
  71. );
  72. foreach my $k (keys %tests) {
  73. my $v = $tests{$k};
  74. my $r1 = $x->$k;
  75. is(ref($r1), $v->[0][0], "1) $k");
  76. like("$r1", $v->[0][1], "1) $k");
  77. my $r2 = $y->$k;
  78. is(ref($r2), $v->[1][0], "2) $k");
  79. like("$r2", $v->[1][1], "2) $k");
  80. }
  81. #
  82. ## atan2() tests
  83. #
  84. my $r = $x->atan2($x);
  85. is(ref($r), $class);
  86. like("$r", qr/^0\.785398163397448309/);
  87. $r = $x->atan2($y);
  88. is(ref($r), $class);
  89. like("$r", qr/^1\.530817639671606/);
  90. $r = $y->atan2($x);
  91. is(ref($r), $class);
  92. like("$r", qr/^0\.0399786871232900414/);
  93. $r = $y->atan2($y);
  94. is(ref($r), $class);
  95. like("$r", qr/^0\.785398163397448309/);
  96. }