gnu_mpc 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/CHANGELOG +5 -0
  2. data/ext/mpc.c +132 -14
  3. data/manual.md +76 -5
  4. data/manual.pdf +0 -0
  5. data/spec/log10_spec.rb +39 -0
  6. metadata +3 -1
data/CHANGELOG ADDED
@@ -0,0 +1,5 @@
1
+ * v 0.8.1
2
+ * Added MPC#/, MPC#div
3
+ * Added MPC#log10
4
+ * v 0.8.0
5
+ * Most things
data/ext/mpc.c CHANGED
@@ -850,6 +850,93 @@ VALUE r_mpc_mul_do_the_work(VALUE self_val, VALUE arg_val, mpc_rnd_t rnd_mode, m
850
850
  return res_val;
851
851
  }
852
852
 
853
+ VALUE r_mpc_div_do_the_work(VALUE self_val, VALUE arg_val, mpc_rnd_t rnd_mode, mpfr_prec_t res_real_prec, mpfr_prec_t res_imag_prec);
854
+ VALUE r_mpc_div(int argc, VALUE *argv, VALUE self_val)
855
+ {
856
+ MP_COMPLEX *self;
857
+ VALUE rnd_mode_val;
858
+ VALUE res_real_prec_val, res_imag_prec_val;
859
+ VALUE arg_val;
860
+
861
+ mpfr_prec_t real_prec, imag_prec;
862
+ mpfr_prec_t res_real_prec, res_imag_prec;
863
+ mpc_rnd_t rnd_mode;
864
+
865
+ mpc_get_struct(self_val,self);
866
+ real_prec = mpfr_get_prec(mpc_realref(self));
867
+ imag_prec = mpfr_get_prec(mpc_imagref(self));
868
+
869
+ //if (argc > 0 && TYPE(argv[0]) == T_HASH) {
870
+ // rb_mpc_get_hash_arguments (&rnd_mode, &real_prec, &imag_prec, argv[0]);
871
+ //res_real_prec = real_prec;
872
+ //res_imag_prec = imag_prec;
873
+ //} else {
874
+ rb_scan_args (argc, argv, "13", &arg_val, &rnd_mode_val, &res_real_prec_val, &res_imag_prec_val);
875
+
876
+ r_mpc_set_default_args (rnd_mode_val, res_real_prec_val, res_imag_prec_val,
877
+ &rnd_mode, &res_real_prec, &res_imag_prec,
878
+ real_prec, imag_prec);
879
+ //}
880
+
881
+ //return res_val;
882
+ return r_mpc_div_do_the_work(self_val, arg_val, rnd_mode, res_real_prec, res_imag_prec);
883
+ }
884
+
885
+ VALUE r_mpc_div2(VALUE self_val, VALUE arg_val)
886
+ {
887
+ MP_COMPLEX *self;
888
+
889
+ mpfr_prec_t res_real_prec, res_imag_prec;
890
+
891
+ mpc_get_struct(self_val, self);
892
+ res_real_prec = mpfr_get_prec(mpc_realref(self));
893
+ res_imag_prec = mpfr_get_prec(mpc_imagref(self));
894
+
895
+ return r_mpc_div_do_the_work(self_val, arg_val, MPC_RNDNN, res_real_prec, res_imag_prec);
896
+ }
897
+
898
+ VALUE r_mpc_div_do_the_work(VALUE self_val, VALUE arg_val, mpc_rnd_t rnd_mode, mpfr_prec_t res_real_prec, mpfr_prec_t res_imag_prec) {
899
+ MP_COMPLEX *self, *res, *arg_c;
900
+ MP_INT *arg_z;
901
+ MP_FLOAT *arg_f;
902
+ VALUE res_val;
903
+
904
+ mpc_get_struct(self_val,self);
905
+
906
+ if (FIXNUM_P (arg_val)) {
907
+ mpc_make_struct_init3 (res_val, res, res_real_prec, res_imag_prec);
908
+ if (FIX2NUM (arg_val) >= 0) {
909
+ mpc_div_ui (res, self, FIX2NUM (arg_val), rnd_mode);
910
+ } else {
911
+ mpc_div_ui (res, self, -FIX2NUM (arg_val), rnd_mode);
912
+ mpc_neg (res, res, rnd_mode);
913
+ }
914
+ } else if (BIGNUM_P (arg_val)) {
915
+ mpc_make_struct_init3 (res_val, res, res_real_prec, res_imag_prec);
916
+ mpz_temp_from_bignum (arg_z, arg_val);
917
+ mpc_set_z (res, arg_z, MPC_RNDNN);
918
+ mpz_temp_free (arg_z);
919
+ mpc_div (res, self, res, rnd_mode);
920
+ } else if (GMPZ_P (arg_val)) {
921
+ mpc_make_struct_init3 (res_val, res, res_real_prec, res_imag_prec);
922
+ mpz_get_struct (arg_val, arg_z);
923
+ mpc_set_z (res, arg_z, MPC_RNDNN);
924
+ mpc_div (res, self, res, rnd_mode);
925
+ } else if (GMPF_P (arg_val)) {
926
+ mpc_make_struct_init3 (res_val, res, res_real_prec, res_imag_prec);
927
+ mpf_get_struct (arg_val, arg_f);
928
+ mpc_div_fr (res, self, arg_f, rnd_mode);
929
+ } else if (MPC_P (arg_val)) {
930
+ mpc_make_struct_init3 (res_val, res, res_real_prec, res_imag_prec);
931
+ mpc_get_struct (arg_val, arg_c);
932
+ mpc_div (res, self, arg_c, rnd_mode);
933
+ } else {
934
+ typeerror(FXC);
935
+ }
936
+
937
+ return res_val;
938
+ }
939
+
853
940
  MPC_SINGLE_FUNCTION(neg)
854
941
 
855
942
  /*
@@ -905,6 +992,34 @@ VALUE r_mpc_abs(int argc, VALUE *argv, VALUE self)
905
992
  return abs;
906
993
  }
907
994
 
995
+ /*
996
+ * call-seq:
997
+ * c.norm
998
+ * c.norm(rounding_mode)
999
+ *
1000
+ * Returns the norm of _c_ (i.e., the square of its absolute value), as a GMP_F float (an MPFR float, really).
1001
+ */
1002
+ VALUE r_mpc_norm(int argc, VALUE *argv, VALUE self)
1003
+ {
1004
+ MP_COMPLEX *self_val;
1005
+ MP_FLOAT *norm_val;
1006
+ VALUE rnd_mode, norm;
1007
+ mpfr_prec_t pr=0, pi=0;
1008
+ mpc_rnd_t rnd_mode_val;
1009
+
1010
+ mpc_get_struct (self, self_val);
1011
+
1012
+ rb_scan_args (argc, argv, "01", &rnd_mode);
1013
+ if (NIL_P (rnd_mode)) { rnd_mode_val = r_mpc_default_rounding_mode; }
1014
+ else { rnd_mode_val = r_get_mpc_rounding_mode (rnd_mode); }
1015
+
1016
+ mpf_make_struct (norm, norm_val);
1017
+ mpc_get_prec2 (&pr, &pi, self_val);
1018
+ mpfr_init2 (norm_val, pr);
1019
+ mpc_norm (norm_val, self_val, rnd_mode_val);
1020
+ return norm;
1021
+ }
1022
+
908
1023
  /*********************************************************************
909
1024
  * Power and Logarithm Functions *
910
1025
  *********************************************************************/
@@ -912,6 +1027,7 @@ VALUE r_mpc_abs(int argc, VALUE *argv, VALUE self)
912
1027
  MPC_SINGLE_FUNCTION(sqrt)
913
1028
  MPC_SINGLE_FUNCTION(exp)
914
1029
  MPC_SINGLE_FUNCTION(log)
1030
+ MPC_SINGLE_FUNCTION(log10)
915
1031
 
916
1032
  /*********************************************************************
917
1033
  * Trigonometric Functions *
@@ -964,20 +1080,22 @@ void Init_mpc() {
964
1080
  rb_define_method (cMPC, "proj", r_mpc_proj, -1);
965
1081
 
966
1082
  // Basic Arithmetic Functions
967
- rb_define_method (cMPC, "add", r_mpc_add, -1);
968
- rb_define_method (cMPC, "+", r_mpc_add2, 1);
969
- rb_define_method (cMPC, "sub", r_mpc_sub, -1);
970
- rb_define_method (cMPC, "-", r_mpc_sub2, 1);
971
- rb_define_method (cMPC, "neg", r_mpc_neg, -1);
972
- rb_define_method (cMPC, "-@", r_mpc_neg2, 0);
973
- rb_define_method (cMPC, "mul", r_mpc_mul, -1);
974
- rb_define_method (cMPC, "*", r_mpc_mul2, 1);
975
- rb_define_method (cMPC, "sqr", r_mpc_sqr, -1);
1083
+ rb_define_method (cMPC, "add", r_mpc_add, -1);
1084
+ rb_define_method (cMPC, "+", r_mpc_add2, 1);
1085
+ rb_define_method (cMPC, "sub", r_mpc_sub, -1);
1086
+ rb_define_method (cMPC, "-", r_mpc_sub2, 1);
1087
+ rb_define_method (cMPC, "neg", r_mpc_neg, -1);
1088
+ rb_define_method (cMPC, "-@", r_mpc_neg2, 0);
1089
+ rb_define_method (cMPC, "mul", r_mpc_mul, -1);
1090
+ rb_define_method (cMPC, "*", r_mpc_mul2, 1);
1091
+ // TODO rb_define_method (cMPC, "mul_i", r_mpc_mul_i, -1);
1092
+ rb_define_method (cMPC, "sqr", r_mpc_sqr, -1);
976
1093
  // TODO rb_define_method (cMPC, "fma", r_mpc_fma, 2);
977
- // TODO rb_define_method (cMPC, "/", r_mpc_div, 1);
978
- rb_define_method (cMPC, "conj", r_mpc_conj, -1);
979
- rb_define_method (cMPC, "abs", r_mpc_abs, -1);
980
- // TODO rb_define_method (cMPC, "norm", r_mpc_norm, 0);
1094
+ rb_define_method (cMPC, "div", r_mpc_div, -1);
1095
+ rb_define_method (cMPC, "/", r_mpc_div2, 1);
1096
+ rb_define_method (cMPC, "conj", r_mpc_conj, -1);
1097
+ rb_define_method (cMPC, "abs", r_mpc_abs, -1);
1098
+ rb_define_method (cMPC, "norm", r_mpc_norm, -1);
981
1099
  // TODO rb_define_method (cMPC, "mul_2exp", r_mpc_mul_2exp, 1);
982
1100
  // TODO rb_define_method (cMPC, "div_2exp", r_mpc_div_2exp, 1);
983
1101
 
@@ -986,7 +1104,7 @@ void Init_mpc() {
986
1104
  // TODO rb_define_method (cMPC, "**", r_mpc_pow, 1);
987
1105
  rb_define_method (cMPC, "exp", r_mpc_exp, -1);
988
1106
  rb_define_method (cMPC, "log", r_mpc_log, -1);
989
- // TODO rb_define_method (cMPC, "log10", r_mpc_log10, -1);
1107
+ rb_define_method (cMPC, "log10", r_mpc_log10, -1);
990
1108
 
991
1109
  // Trigonometric Functions
992
1110
  rb_define_method (cMPC, "sin", r_mpc_sin, -1);
data/manual.md CHANGED
@@ -455,6 +455,7 @@ according to $rounding\_mode$.
455
455
  \texttt{a = MPC.new(GMP::F("3.1416", 12)) \#=> (3.1416 +0) \newline
456
456
  a + 0 \qqqquad\qqqquad\qquad\qqqquad \#=> (3.1416 +0) \newline
457
457
  a + 1 \qqqquad\qqqquad\qqqquad\qquad \#=> (4.1406 +0) \newline
458
+ a - -7 \qqqquad\qqqquad\qqqquad\quad\ \#=> (-3.8584 +0) \newline
458
459
  a + GMP::Z(1024) \qqqquad\qqqquad\ \#=> (1.0270e+3 +0) \newline
459
460
  a + 2**66 \qqqquad\qqqquad\qqqquad \#=> (7.3787e+19 +0) \newline
460
461
  a + GMP::F("3.1416", 12) \qqqquad\ \#=> (6.2832 +0) \newline}
@@ -472,6 +473,7 @@ according to $rounding\_mode$.
472
473
  \texttt{a = MPC.new(GMP::F("3.1416", 12)) \#=> (3.1416 +0) \newline
473
474
  a - 0 \qqqquad\qqqquad\qquad\qqqquad \#=> (3.1416 +0) \newline
474
475
  a - 1 \qqqquad\qqqquad\qqqquad\qquad \#=> (2.1416 +0) \newline
476
+ a - -7 \qqqquad\qqqquad\qqqquad\quad\ \#=> (1.0141e+1 +0) \newline
475
477
  a - GMP::Z(1024) \qqqquad\qqqquad\ \#=> (-1.0208e+3 +0) \newline
476
478
  a - 2**66 \qqqquad\qqqquad\qqqquad \#=> (-7.3787e+19 +0) \newline
477
479
  a - GMP::F("3.1416", 12) \qqqquad\ \#=> (+0 +0) \newline}
@@ -489,12 +491,33 @@ according to $rounding\_mode$.
489
491
  \texttt{a = MPC.new(GMP::F("3.1416", 12)) \#=> (3.1416 +0) \newline
490
492
  a * 0 \qqqquad\qqqquad\qquad\qqqquad \#=> (+0 +0) \newline
491
493
  a * 1 \qqqquad\qqqquad\qqqquad\qquad \#=> (3.1416 +0) \newline
494
+ a * -7 \qqqquad\qqqquad\qqqquad\quad\ \#=> (-2.1992e+1 -0)\newline
492
495
  a * GMP::Z(1024) \qqqquad\qqqquad\ \#=> (3.2170e+3 +0) \newline
493
496
  a * 2**66 \qqqquad\qqqquad\qqqquad \#=> (2.3181e+20 +0) \newline
494
497
  a * GMP::F("3.1416", 12) \qqqquad\ \#=> (9.8711 +0) \newline}
495
498
  }
496
499
  \end{tabular}
497
500
 
501
+ \begin{tabular}{p{\methwidth} l r p{\returnwidth}}
502
+ \toprule
503
+ \textbf{div, /} & & MPC\#div($op2$) & $\rightarrow complex$ \\
504
+ & & MPC\#div($op2$, $rounding\_mode$ = MPC::MPC\_RNDNN) & $\rightarrow complex$ \\
505
+ & & $op1 / op2$ & $\rightarrow complex$ \\
506
+ \cmidrule(r){2-4}
507
+ & \multicolumn{3}{p{\defnwidth}}{
508
+ Return the quotient of the receiver ($op1$) and $op2$, rounded according to
509
+ $rounding\_mode$. $op2$ may be a \texttt{Fixnum}, \texttt{GMP::Z}, \texttt{Bignum}, or \texttt{GMP::F}.\newline
510
+
511
+ \texttt{a = MPC.new(GMP::F("3.1416", 12)) \#=> (3.1416 +0) \newline
512
+ a / 0 \qqqquad\qqqquad\qquad\qqqquad \#=> (@Inf@ @NaN@) \newline
513
+ a / 1 \qqqquad\qqqquad\qqqquad\qquad \#=> (3.1416 +0) \newline
514
+ a / -7 \qqqquad\qqqquad\qqqquad\quad\ \#=> (-4.4885e-1 -0)\newline
515
+ a / GMP::Z(1024) \qqqquad\qqqquad\ \#=> (3.0680e-3 +0) \newline
516
+ a / 2**66 \qqqquad\qqqquad\qqqquad \#=> (4.9088e-2 +0) \newline
517
+ a / GMP::F("3.1416", 12) \qqqquad\ \#=> (1.0000 +0) \newline}
518
+ }
519
+ \end{tabular}
520
+
498
521
  \ifdef{HTML}
499
522
  <table>
500
523
  <tr class="new-method">
@@ -516,6 +539,7 @@ $rounding\_mode$.
516
539
  <pre><code>a = MPC.new(GMP::F("3.1416", 12)) #=> (3.1416 +0)
517
540
  a + 0 #=> (3.1416 +0)
518
541
  a + 1 #=> (4.1406 +0)
542
+ a + -7 #=> (-3.8584 +0)
519
543
  a + GMP::Z(1024) #=> (1.0270e+3 +0)
520
544
  a + 2**66 #=> (7.3787e+19 +0)
521
545
  a + GMP::F("3.1416", 12) #=> (6.2832 +0)
@@ -542,6 +566,7 @@ $rounding\_mode$.
542
566
  <pre><code>a = MPC.new(GMP::F("3.1416", 12)) #=> (3.1416 +0)
543
567
  a - 0 #=> (3.1416 +0)
544
568
  a - 1 #=> (2.1416 +0)
569
+ a - -7 #=> (1.0141e+1 +0)
545
570
  a - GMP::Z(1024) #=> (-1.0208e+3 +0)
546
571
  a - 2**66 #=> (-7.3787e+19 +0)
547
572
  a - GMP::F("3.1416", 12) #=> (+0 +0)
@@ -568,9 +593,37 @@ $rounding\_mode$.
568
593
  <pre><code>a = MPC.new(GMP::F("3.1416", 12)) #=> (3.1416 +0)
569
594
  a * 0 #=> (+0 +0)
570
595
  a * 1 #=> (3.1416 +0)
596
+ a * -7 #=> (-2.1992e+1 -0)
571
597
  a * GMP::Z(1024) #=> (3.2170e+3 +0)
572
598
  a * 2**66 #=> (2.3181e+20 +0)
573
599
  a * GMP::F("3.1416", 12) #=> (9.8711 +0)
600
+ </code></pre>
601
+ </td>
602
+ </tr>
603
+
604
+ <tr class="new-method">
605
+ <th>div, /</th><th>`MPC#div(op2)` $\rightarrow$ _complex_
606
+ </tr>
607
+ <tr>
608
+ <th></th> <th><code>MPC#div(_op2_, _rounding_mode_ = MPC::MPC_RNDNN)</code> $\rightarrow$ _complex_
609
+ </th>
610
+ </tr>
611
+ <tr class="last-header">
612
+ <th></th> <th>`op1 / op2` $\rightarrow$ _complex_
613
+ </tr>
614
+ <tr>
615
+ <td></td>
616
+ <td>
617
+ Return the quotient of the receiver ($op1$) and $op2$, rounded according to
618
+ $rounding\_mode$.
619
+
620
+ <pre><code>a = MPC.new(GMP::F("3.1416", 12)) #=> (3.1416 +0)
621
+ a / 0 #=> (@Inf@ @NaN@)
622
+ a / 1 #=> (3.1416 +0)
623
+ a / -7 #=> (-4.4885e-1 -0)
624
+ a / GMP::Z(1024) #=> (3.0680e-3 +0)
625
+ a / 2**66 #=> (4.9088e-2 +0)
626
+ a / GMP::F("3.1416", 12) #=> (1.0000 +0)
574
627
  </code></pre>
575
628
  </td>
576
629
  </tr>
@@ -629,7 +682,16 @@ a * GMP::F("3.1416", 12) #=> (9.8711 +0)
629
682
 
630
683
  \toprule
631
684
  \textbf{log10} & & MPC\#log10() & $\rightarrow$ \textit{complex} \\
632
- & \multicolumn{3}{p{\defnwidth}}{\textit{Not implemented yet.}}
685
+ & & MPC\#log10(\textit{rounding\_mode} = MPC::MPC\_RNDNN, & \\
686
+ & & \textit{precision} = \textit{mpfr\_default\_precision}) & $\rightarrow$ \textit{complex} \\
687
+ & & MPC\#log10(\textit{options\_hash}) & $\rightarrow$ \textit{complex} \\
688
+ \cmidrule(r){2-4}
689
+ & \multicolumn{3}{p{\defnwidth}}{
690
+ Return the base-10 logarithm of the receiver, rounded according to
691
+ $rounding\_mode$. The principal branch is chosen, with the branch cut on the
692
+ negative real axis, so that the imaginary part of the result lies in
693
+ $[-\pi, \pi]$ and $[-\pi/log(10), \pi/log(10)]$ respectively.
694
+ }
633
695
  \end{tabular}
634
696
 
635
697
  \ifdef{HTML}
@@ -700,14 +762,23 @@ $[-\pi, \pi]$ and $[-\pi/log(10), \pi/log(10)]$ respectively.
700
762
  </td>
701
763
  </tr>
702
764
 
703
-
704
- <tr class="new-method last-header">
705
- <th>log10</th><th>`MPC#log10()` $\rightarrow$ _complex_
765
+ <tr class="new-method">
766
+ <th>log10</th><th>`MPC#log()` $\rightarrow$ _complex_
767
+ </tr>
768
+ <tr>
769
+ <th></th> <th><code>MPC#log10(_rounding_mode_ = MPC::MPC_RNDNN, _precision_ = _mpfr_default_)</code> $\rightarrow$ _complex_
770
+ </th>
771
+ </tr>
772
+ <tr class="last-header">
773
+ <th></th> <th>`MPC#log10(options_hash)` $\rightarrow$ _complex_</th>
706
774
  </tr>
707
775
  <tr>
708
776
  <td></td>
709
777
  <td>
710
- _Not implemented yet._
778
+ Return the base-10 logarithm of the receiver, rounded according to
779
+ $rounding\_mode$. The principal branch is chosen, with the branch cut on the
780
+ negative real axis, so that the imaginary part of the result lies in
781
+ $[-\pi, \pi]$ and $[-\pi/log(10), \pi/log(10)]$ respectively.
711
782
  </td>
712
783
  </tr>
713
784
  </table>
data/manual.pdf CHANGED
Binary file
@@ -0,0 +1,39 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/log10.dat
4
+ describe MPC, '#log' do
5
+ it 'should calculate the base 10 logarithm of +1 +- i*0' do
6
+ actual = MPC.new([1, 0], 2).log10
7
+ actual.real.should eq 0
8
+ actual.imag.should eq 0
9
+ end
10
+
11
+ it 'should calculate the base 10 logarithm of 10 +- i*0' do
12
+ actual = MPC.new([GMP::F(10, 4), GMP::F(0, 2)]).log10
13
+ actual.real.should eq 1
14
+ actual.imag.should eq 0
15
+ end
16
+
17
+ it 'should calculate the base 10 logarithm of 100 +- i*0' do
18
+ actual = MPC.new([GMP::F(100, 5), GMP::F(0, 2)]).log10
19
+ actual.real.should eq 2
20
+ actual.imag.should eq 0
21
+ end
22
+
23
+ it 'should calculate the base 10 logarithm of x +i*y with either x or y zero and the other non-zero' do
24
+ data = [
25
+ [["0x13afeb354b7d97p-52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x11", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
26
+ [["0x13afeb354b7d97p-52", 53, 16], [ "0x15d47c4cb2fba1p-53", 53, 16], MPC.new([GMP::F(0, 2), GMP::F( "0x11", 5, 16)]), MPC::MPC_RNDNN],
27
+ [["0x1475c655fbc11p-48", 53, 16], [ "0x15d47c4cb2fba1p-52", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
28
+ [["0x1475c655fbc11p-48", 53, 16], ["-0x15d47c4cb2fba1p-52", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), -GMP::F(0, 2)]), MPC::MPC_RNDNN],
29
+ [["0x1475c655fbc11p-48", 53, 16], ["-0x15d47c4cb2fba1p-53", 53, 16], MPC.new([GMP::F(0, 2), GMP::F("-0x13", 5, 16)]), MPC::MPC_RNDNN],
30
+ ]
31
+ data.each do |expected_real, expected_imag, input, rounding_mode|
32
+ actual = input.log10(rounding_mode)
33
+ actual.real.should eq GMP::F.new(*expected_real)
34
+ actual.imag.should eq GMP::F.new(*expected_imag)
35
+ end
36
+ end
37
+
38
+ ### There are still more tests in log10.data, each a result of some bug or other thing
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnu_mpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,6 +36,7 @@ files:
36
36
  - spec/cosh_spec.rb
37
37
  - spec/exp_spec.rb
38
38
  - spec/hash_arguments_spec.rb
39
+ - spec/log10_spec.rb
39
40
  - spec/log_spec.rb
40
41
  - spec/mpc_single_function_args_spec.rb
41
42
  - spec/neg_spec.rb
@@ -54,6 +55,7 @@ files:
54
55
  - spec/to_s_spec.rb
55
56
  - spec/version_spec.rb
56
57
  - README.md
58
+ - CHANGELOG
57
59
  - manual.md
58
60
  - manual.pdf
59
61
  - COPYING.md