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.
- data/CHANGELOG +5 -0
- data/ext/mpc.c +132 -14
- data/manual.md +76 -5
- data/manual.pdf +0 -0
- data/spec/log10_spec.rb +39 -0
- metadata +3 -1
data/CHANGELOG
ADDED
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",
|
968
|
-
rb_define_method (cMPC, "+",
|
969
|
-
rb_define_method (cMPC, "sub",
|
970
|
-
rb_define_method (cMPC, "-",
|
971
|
-
rb_define_method (cMPC, "neg",
|
972
|
-
rb_define_method (cMPC, "-@",
|
973
|
-
rb_define_method (cMPC, "mul",
|
974
|
-
rb_define_method (cMPC, "*",
|
975
|
-
rb_define_method (cMPC, "
|
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
|
-
|
978
|
-
rb_define_method (cMPC, "
|
979
|
-
rb_define_method (cMPC, "
|
980
|
-
|
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
|
-
|
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
|
-
& \
|
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
|
-
|
705
|
-
|
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
|
-
|
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
|
data/spec/log10_spec.rb
ADDED
@@ -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.
|
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
|