gmp 0.4.1-x86-mingw32 → 0.4.3-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +14 -0
- data/README.rdoc +49 -17
- data/benchmark/runbench.rb +165 -165
- data/ext/gmp.c +63 -30
- data/ext/gmp.so +0 -0
- data/ext/gmpf.c +207 -3
- data/ext/gmpf.h +0 -132
- data/ext/gmprandstate.c +56 -2
- data/ext/libmpfr-1.dll +0 -0
- data/ext/ruby_gmp.h +39 -0
- data/manual.pdf +0 -0
- data/manual.tex +67 -7
- data/test/mpfr_tsqrt.rb +53 -0
- data/test/tc_f_precision.rb +99 -34
- data/test/tc_mpfr_functions.rb +45 -0
- data/test/tc_mpfr_random.rb +49 -0
- data/test/test_helper.rb +1 -0
- data/test/unit_tests.rb +9 -14
- metadata +8 -3
data/ext/gmp.c
CHANGED
@@ -121,6 +121,51 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
|
|
121
121
|
return Qnil;
|
122
122
|
}
|
123
123
|
|
124
|
+
#ifdef MPFR
|
125
|
+
static VALUE r_gmpfsg_get_default_rounding_mode(VALUE klass)
|
126
|
+
{
|
127
|
+
(void)klass;
|
128
|
+
const char *rounding_string_val;
|
129
|
+
VALUE rounding_string;
|
130
|
+
ID method_to_sym = rb_intern("to_sym");
|
131
|
+
rounding_string_val = mpfr_print_rnd_mode (mpfr_get_default_rounding_mode ());
|
132
|
+
rounding_string = rb_str_new2 (rounding_string_val);
|
133
|
+
/*return rb_const_get (mGMP, rb_intern (rounding_string));*/
|
134
|
+
return rb_funcall (rounding_string, method_to_sym, 0);
|
135
|
+
}
|
136
|
+
|
137
|
+
static VALUE r_gmpfsg_set_default_rounding_mode(VALUE klass, VALUE arg)
|
138
|
+
{
|
139
|
+
(void)klass;
|
140
|
+
int arg_val;
|
141
|
+
if (FIXNUM_P(arg)) {
|
142
|
+
arg_val = FIX2INT(arg);
|
143
|
+
if (arg_val < 0 || arg_val > 3) {
|
144
|
+
rb_raise(rb_eRangeError, "rounding mode must be one of the rounding mode constants.");
|
145
|
+
}
|
146
|
+
} else {
|
147
|
+
rb_raise(rb_eTypeError, "rounding mode must be one of the rounding mode constants.");
|
148
|
+
}
|
149
|
+
|
150
|
+
switch (arg_val) {
|
151
|
+
case 0:
|
152
|
+
mpfr_set_default_rounding_mode (GMP_RNDN);
|
153
|
+
break;
|
154
|
+
case 1:
|
155
|
+
mpfr_set_default_rounding_mode (GMP_RNDZ);
|
156
|
+
break;
|
157
|
+
case 2:
|
158
|
+
mpfr_set_default_rounding_mode (GMP_RNDU);
|
159
|
+
break;
|
160
|
+
case 3:
|
161
|
+
mpfr_set_default_rounding_mode (GMP_RNDD);
|
162
|
+
break;
|
163
|
+
}
|
164
|
+
|
165
|
+
return Qnil;
|
166
|
+
}
|
167
|
+
#endif /* MPFR */
|
168
|
+
|
124
169
|
#include "gmpf.h"
|
125
170
|
#include "gmpq.h"
|
126
171
|
/* #include "gmpz.h" */
|
@@ -135,6 +180,18 @@ static VALUE r_gmpfsg_set_default_prec(VALUE klass, VALUE arg)
|
|
135
180
|
void Init_gmp() {
|
136
181
|
mGMP = rb_define_module("GMP");
|
137
182
|
rb_define_const(mGMP, "GMP_VERSION", rb_str_new2(gmp_version));
|
183
|
+
rb_define_const(mGMP, "GMP_CC", rb_str_new2(__GMP_CC));
|
184
|
+
rb_define_const(mGMP, "GMP_CFLAGS", rb_str_new2(__GMP_CFLAGS));
|
185
|
+
rb_define_const(mGMP, "GMP_BITS_PER_LIMB", INT2FIX(mp_bits_per_limb));
|
186
|
+
#ifdef MPFR
|
187
|
+
rb_define_const(mGMP, "MPFR_VERSION", rb_str_new2(MPFR_VERSION_STRING));
|
188
|
+
rb_define_const(mGMP, "MPFR_PREC_MIN", INT2FIX(MPFR_PREC_MIN));
|
189
|
+
rb_define_const(mGMP, "MPFR_PREC_MAX", INT2FIX(MPFR_PREC_MAX));
|
190
|
+
rb_define_const(mGMP, "GMP_RNDN", INT2FIX(0));
|
191
|
+
rb_define_const(mGMP, "GMP_RNDZ", INT2FIX(1));
|
192
|
+
rb_define_const(mGMP, "GMP_RNDU", INT2FIX(2));
|
193
|
+
rb_define_const(mGMP, "GMP_RNDD", INT2FIX(3));
|
194
|
+
#endif /* MPFR */
|
138
195
|
|
139
196
|
cGMP_Z = rb_define_class_under(mGMP, "Z", rb_cInteger);
|
140
197
|
init_gmpz();
|
@@ -149,8 +206,12 @@ void Init_gmp() {
|
|
149
206
|
|
150
207
|
cGMP_F = rb_define_class_under (mGMP, "F", rb_cNumeric);
|
151
208
|
init_gmpf();
|
152
|
-
rb_define_singleton_method(cGMP_F, "default_prec", r_gmpfsg_get_default_prec, 0);
|
153
|
-
rb_define_singleton_method(cGMP_F, "default_prec=", r_gmpfsg_set_default_prec, 1);
|
209
|
+
rb_define_singleton_method (cGMP_F, "default_prec", r_gmpfsg_get_default_prec, 0);
|
210
|
+
rb_define_singleton_method (cGMP_F, "default_prec=", r_gmpfsg_set_default_prec, 1);
|
211
|
+
#ifdef MPFR
|
212
|
+
rb_define_singleton_method (cGMP_F, "default_rounding_mode", r_gmpfsg_get_default_rounding_mode, 0);
|
213
|
+
rb_define_singleton_method (cGMP_F, "default_rounding_mode=", r_gmpfsg_set_default_rounding_mode, 1);
|
214
|
+
#endif /* MPFR */
|
154
215
|
rb_define_method(cGMP_F, "coerce", r_gmpf_coerce, 1); // new method - testing
|
155
216
|
|
156
217
|
/* rb_define_method(cGMP_F, "cmpabs", r_gmpf_cmpabs, 1);*/
|
@@ -160,34 +221,6 @@ void Init_gmp() {
|
|
160
221
|
|
161
222
|
init_gmpbench_timing();
|
162
223
|
|
163
|
-
#ifdef MPFR
|
164
|
-
rb_define_method(cGMP_F, "exp", r_gmpfr_exp, 0);
|
165
|
-
rb_define_method(cGMP_F, "log", r_gmpfr_log, 0);
|
166
|
-
rb_define_method(cGMP_F, "sqrt", r_gmpfr_sqrt, 0);
|
167
|
-
rb_define_method(cGMP_F, "cos", r_gmpfr_cos, 0);
|
168
|
-
rb_define_method(cGMP_F, "sin", r_gmpfr_sin, 0);
|
169
|
-
rb_define_method(cGMP_F, "tan", r_gmpfr_tan, 0);
|
170
|
-
rb_define_method(cGMP_F, "acos", r_gmpfr_acos, 0);
|
171
|
-
rb_define_method(cGMP_F, "asin", r_gmpfr_asin, 0);
|
172
|
-
rb_define_method(cGMP_F, "atan", r_gmpfr_atan, 0);
|
173
|
-
rb_define_method(cGMP_F, "cosh", r_gmpfr_cosh, 0);
|
174
|
-
rb_define_method(cGMP_F, "sinh", r_gmpfr_sinh, 0);
|
175
|
-
rb_define_method(cGMP_F, "tanh", r_gmpfr_tanh, 0);
|
176
|
-
rb_define_method(cGMP_F, "acosh", r_gmpfr_acosh, 0);
|
177
|
-
rb_define_method(cGMP_F, "asinh", r_gmpfr_asinh, 0);
|
178
|
-
rb_define_method(cGMP_F, "atanh", r_gmpfr_atanh, 0);
|
179
|
-
rb_define_method(cGMP_F, "log1p", r_gmpfr_log1p, 0);
|
180
|
-
rb_define_method(cGMP_F, "expm1", r_gmpfr_expm1, 0);
|
181
|
-
rb_define_method(cGMP_F, "log2", r_gmpfr_log2, 0);
|
182
|
-
rb_define_method(cGMP_F, "log10", r_gmpfr_log10, 0);
|
183
|
-
|
184
|
-
rb_define_method(cGMP_F, "nan?", r_gmpfr_nan_p, 0);
|
185
|
-
rb_define_method(cGMP_F, "infinite?", r_gmpfr_inf_p, 0);
|
186
|
-
rb_define_method(cGMP_F, "finite?", r_gmpfr_fin_p, 0);
|
187
|
-
rb_define_method(cGMP_F, "number?", r_gmpfr_number_p, 0);
|
188
|
-
|
189
|
-
rb_define_method(cGMP_F, "**", r_gmpfr_pow, 1);
|
190
|
-
#endif /* MPFR */
|
191
224
|
// more
|
192
225
|
|
193
226
|
REGISTER_TAKEOVER(and, "&", "old_and")
|
data/ext/gmp.so
ADDED
Binary file
|
data/ext/gmpf.c
CHANGED
@@ -105,7 +105,7 @@ VALUE r_gmpf_initialize(int argc, VALUE *argv, VALUE self)
|
|
105
105
|
else
|
106
106
|
rb_raise(rb_eRangeError, "prec must be non-negative");
|
107
107
|
} else {
|
108
|
-
rb_raise(rb_eTypeError, "prec must be
|
108
|
+
rb_raise(rb_eTypeError, "prec must be a Fixnum");
|
109
109
|
}
|
110
110
|
} else if (GMPF_P(arg)) {
|
111
111
|
mpf_get_struct (arg, arg_val_f);
|
@@ -515,6 +515,166 @@ DEFUN_FLOAT_CMP(gt,>)
|
|
515
515
|
DEFUN_FLOAT_CMP(ge,>=)
|
516
516
|
|
517
517
|
|
518
|
+
#ifdef MPFR
|
519
|
+
|
520
|
+
#define MPFR_SINGLE_FUNCTION(name) \
|
521
|
+
VALUE r_gmpfr_##name(VALUE self) \
|
522
|
+
{ \
|
523
|
+
MP_FLOAT *self_val, *res_val; \
|
524
|
+
unsigned long prec; \
|
525
|
+
VALUE res; \
|
526
|
+
\
|
527
|
+
mpf_get_struct_prec (self, self_val, prec); \
|
528
|
+
mpf_make_struct_init (res, res_val, prec); \
|
529
|
+
mpfr_##name (res_val, self_val, __gmp_default_rounding_mode); \
|
530
|
+
\
|
531
|
+
return res; \
|
532
|
+
}
|
533
|
+
|
534
|
+
#define MPFR_CONST_FUNCTION(name) \
|
535
|
+
VALUE r_gmpfrsg_##name() \
|
536
|
+
{ \
|
537
|
+
MP_FLOAT *res_val; \
|
538
|
+
VALUE res; \
|
539
|
+
\
|
540
|
+
mpf_make_struct (res, res_val); \
|
541
|
+
mpf_init (res_val); \
|
542
|
+
mpfr_##name (res_val, __gmp_default_rounding_mode); \
|
543
|
+
\
|
544
|
+
return res; \
|
545
|
+
}
|
546
|
+
|
547
|
+
MPFR_SINGLE_FUNCTION(sqrt)
|
548
|
+
|
549
|
+
MPFR_SINGLE_FUNCTION(log)
|
550
|
+
MPFR_SINGLE_FUNCTION(log2)
|
551
|
+
MPFR_SINGLE_FUNCTION(log10)
|
552
|
+
MPFR_SINGLE_FUNCTION(exp)
|
553
|
+
|
554
|
+
MPFR_SINGLE_FUNCTION(cos)
|
555
|
+
MPFR_SINGLE_FUNCTION(sin)
|
556
|
+
MPFR_SINGLE_FUNCTION(tan)
|
557
|
+
MPFR_SINGLE_FUNCTION(sec)
|
558
|
+
MPFR_SINGLE_FUNCTION(csc)
|
559
|
+
MPFR_SINGLE_FUNCTION(cot)
|
560
|
+
|
561
|
+
MPFR_SINGLE_FUNCTION(acos)
|
562
|
+
MPFR_SINGLE_FUNCTION(asin)
|
563
|
+
MPFR_SINGLE_FUNCTION(atan)
|
564
|
+
|
565
|
+
MPFR_SINGLE_FUNCTION(cosh)
|
566
|
+
MPFR_SINGLE_FUNCTION(sinh)
|
567
|
+
MPFR_SINGLE_FUNCTION(tanh)
|
568
|
+
|
569
|
+
MPFR_SINGLE_FUNCTION(acosh)
|
570
|
+
MPFR_SINGLE_FUNCTION(asinh)
|
571
|
+
MPFR_SINGLE_FUNCTION(atanh)
|
572
|
+
|
573
|
+
MPFR_SINGLE_FUNCTION(log1p)
|
574
|
+
MPFR_SINGLE_FUNCTION(expm1)
|
575
|
+
|
576
|
+
MPFR_CONST_FUNCTION(const_log2)
|
577
|
+
MPFR_CONST_FUNCTION(const_pi)
|
578
|
+
MPFR_CONST_FUNCTION(const_euler)
|
579
|
+
MPFR_CONST_FUNCTION(const_catalan)
|
580
|
+
|
581
|
+
static VALUE r_gmpfr_nan_p(VALUE self)
|
582
|
+
{
|
583
|
+
MP_FLOAT *self_val;
|
584
|
+
|
585
|
+
mpf_get_struct(self, self_val);
|
586
|
+
if (mpfr_nan_p(self_val)) {
|
587
|
+
return Qtrue;
|
588
|
+
}
|
589
|
+
else {
|
590
|
+
return Qfalse;
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
static VALUE r_gmpfr_inf_p(VALUE self)
|
595
|
+
{
|
596
|
+
MP_FLOAT *self_val;
|
597
|
+
|
598
|
+
mpf_get_struct(self, self_val);
|
599
|
+
if (mpfr_inf_p(self_val)) {
|
600
|
+
return Qtrue;
|
601
|
+
}
|
602
|
+
else {
|
603
|
+
return Qfalse;
|
604
|
+
}
|
605
|
+
}
|
606
|
+
|
607
|
+
static VALUE r_gmpfr_fin_p(VALUE self)
|
608
|
+
{
|
609
|
+
if (r_gmpfr_inf_p(self)) {
|
610
|
+
return Qfalse;
|
611
|
+
}
|
612
|
+
else {
|
613
|
+
return Qtrue;
|
614
|
+
}
|
615
|
+
}
|
616
|
+
|
617
|
+
static VALUE r_gmpfr_number_p(VALUE self)
|
618
|
+
{
|
619
|
+
MP_FLOAT *self_val;
|
620
|
+
|
621
|
+
mpf_get_struct(self, self_val);
|
622
|
+
if (mpfr_number_p(self_val)) {
|
623
|
+
return Qtrue;
|
624
|
+
}
|
625
|
+
else {
|
626
|
+
return Qfalse;
|
627
|
+
}
|
628
|
+
}
|
629
|
+
|
630
|
+
static VALUE r_gmpfr_pow(VALUE self, VALUE arg)
|
631
|
+
{
|
632
|
+
MP_FLOAT *self_val, *res_val, *arg_val_f;
|
633
|
+
MP_RAT *arg_val_q;
|
634
|
+
MP_INT *arg_val_z;
|
635
|
+
unsigned long prec;
|
636
|
+
VALUE res;
|
637
|
+
|
638
|
+
mpf_get_struct_prec(self, self_val, prec);
|
639
|
+
|
640
|
+
if (GMPF_P(arg)) {
|
641
|
+
mpf_get_struct(arg, arg_val_f);
|
642
|
+
prec_max(prec, arg_val_f);
|
643
|
+
mpf_make_struct_init(res, res_val, prec);
|
644
|
+
mpfr_pow(res_val, self_val, arg_val_f, __gmp_default_rounding_mode);
|
645
|
+
} else {
|
646
|
+
mpf_make_struct_init(res, res_val, prec);
|
647
|
+
|
648
|
+
if (GMPZ_P(arg)) {
|
649
|
+
mpz_get_struct(arg, arg_val_z);
|
650
|
+
mpf_set_z(res_val, arg_val_z);
|
651
|
+
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
652
|
+
} else if (GMPQ_P(arg)) {
|
653
|
+
mpq_get_struct(arg, arg_val_q);
|
654
|
+
mpf_set_q(res_val, arg_val_q);
|
655
|
+
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
656
|
+
} else if (FLOAT_P(arg)) {
|
657
|
+
mpf_set_d(res_val, NUM2DBL(arg));
|
658
|
+
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
659
|
+
} else if (FIXNUM_P(arg)) {
|
660
|
+
mpfr_pow_si(res_val, self_val, FIX2INT(arg), __gmp_default_rounding_mode);
|
661
|
+
} else if (BIGNUM_P(arg)) {
|
662
|
+
mpz_temp_from_bignum(arg_val_z, arg);
|
663
|
+
mpf_set_z(res_val, arg_val_z);
|
664
|
+
mpz_temp_free(arg_val_z);
|
665
|
+
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
666
|
+
} else {
|
667
|
+
typeerror(ZQFXBD);
|
668
|
+
}
|
669
|
+
|
670
|
+
}
|
671
|
+
|
672
|
+
return res;
|
673
|
+
}
|
674
|
+
|
675
|
+
#endif
|
676
|
+
|
677
|
+
|
518
678
|
/**********************************************************************
|
519
679
|
* _unsorted_ *
|
520
680
|
**********************************************************************/
|
@@ -549,8 +709,6 @@ VALUE r_gmpf_get_prec(VALUE self)
|
|
549
709
|
void init_gmpf()
|
550
710
|
{
|
551
711
|
mGMP = rb_define_module("GMP");
|
552
|
-
// rb_define_module_function(mGMP, "Z", r_gmpmod_z, -1);
|
553
|
-
// rb_define_module_function(mGMP, "Q", r_gmpmod_q, -1);
|
554
712
|
rb_define_module_function(mGMP, "F", r_gmpmod_f, -1);
|
555
713
|
|
556
714
|
cGMP_F = rb_define_class_under (mGMP, "F", rb_cNumeric);
|
@@ -583,6 +741,52 @@ void init_gmpf()
|
|
583
741
|
rb_define_method(cGMP_F, "<=", r_gmpf_cmp_le, 1);
|
584
742
|
rb_define_method(cGMP_F, "==", r_gmpf_eq, 1);
|
585
743
|
|
744
|
+
#ifdef MPFR
|
745
|
+
// Basic Arithmetic Functions
|
746
|
+
rb_define_method(cGMP_F, "sqrt", r_gmpfr_sqrt, 0);
|
747
|
+
|
748
|
+
rb_define_method(cGMP_F, "**", r_gmpfr_pow, 1);
|
749
|
+
|
750
|
+
// Comparison Functions
|
751
|
+
rb_define_method(cGMP_F, "nan?", r_gmpfr_nan_p, 0);
|
752
|
+
rb_define_method(cGMP_F, "infinite?", r_gmpfr_inf_p, 0);
|
753
|
+
rb_define_method(cGMP_F, "finite?", r_gmpfr_fin_p, 0);
|
754
|
+
rb_define_method(cGMP_F, "number?", r_gmpfr_number_p, 0);
|
755
|
+
|
756
|
+
// Special Functions
|
757
|
+
rb_define_method(cGMP_F, "log", r_gmpfr_log, 0);
|
758
|
+
rb_define_method(cGMP_F, "log2", r_gmpfr_log2, 0);
|
759
|
+
rb_define_method(cGMP_F, "log10", r_gmpfr_log10, 0);
|
760
|
+
rb_define_method(cGMP_F, "exp", r_gmpfr_exp, 0);
|
761
|
+
|
762
|
+
rb_define_method(cGMP_F, "cos", r_gmpfr_cos, 0);
|
763
|
+
rb_define_method(cGMP_F, "sin", r_gmpfr_sin, 0);
|
764
|
+
rb_define_method(cGMP_F, "tan", r_gmpfr_tan, 0);
|
765
|
+
rb_define_method(cGMP_F, "sec", r_gmpfr_sec, 0);
|
766
|
+
rb_define_method(cGMP_F, "csc", r_gmpfr_csc, 0);
|
767
|
+
rb_define_method(cGMP_F, "cot", r_gmpfr_cot, 0);
|
768
|
+
|
769
|
+
rb_define_method(cGMP_F, "acos", r_gmpfr_acos, 0);
|
770
|
+
rb_define_method(cGMP_F, "asin", r_gmpfr_asin, 0);
|
771
|
+
rb_define_method(cGMP_F, "atan", r_gmpfr_atan, 0);
|
772
|
+
|
773
|
+
rb_define_method(cGMP_F, "cosh", r_gmpfr_cosh, 0);
|
774
|
+
rb_define_method(cGMP_F, "sinh", r_gmpfr_sinh, 0);
|
775
|
+
rb_define_method(cGMP_F, "tanh", r_gmpfr_tanh, 0);
|
776
|
+
|
777
|
+
rb_define_method(cGMP_F, "acosh", r_gmpfr_acosh, 0);
|
778
|
+
rb_define_method(cGMP_F, "asinh", r_gmpfr_asinh, 0);
|
779
|
+
rb_define_method(cGMP_F, "atanh", r_gmpfr_atanh, 0);
|
780
|
+
|
781
|
+
rb_define_method(cGMP_F, "log1p", r_gmpfr_log1p, 0);
|
782
|
+
rb_define_method(cGMP_F, "expm1", r_gmpfr_expm1, 0);
|
783
|
+
|
784
|
+
rb_define_singleton_method(cGMP_F, "const_log2", r_gmpfrsg_const_log2, 0);
|
785
|
+
rb_define_singleton_method(cGMP_F, "const_pi", r_gmpfrsg_const_pi, 0);
|
786
|
+
rb_define_singleton_method(cGMP_F, "const_euler", r_gmpfrsg_const_euler, 0);
|
787
|
+
rb_define_singleton_method(cGMP_F, "const_catalan", r_gmpfrsg_const_catalan, 0);
|
788
|
+
#endif /* MPFR */
|
789
|
+
|
586
790
|
// _unsorted_
|
587
791
|
rb_define_method(cGMP_F, "floor", r_gmpf_floor, 0);
|
588
792
|
rb_define_method(cGMP_F, "floor!", r_gmpf_floor_self, 0);
|
data/ext/gmpf.h
CHANGED
@@ -9,136 +9,4 @@
|
|
9
9
|
|
10
10
|
#include <ruby_gmp.h>
|
11
11
|
|
12
|
-
#ifdef MPFR
|
13
|
-
#define MPFR_SINGLE_FUNCTION(name) \
|
14
|
-
static VALUE r_gmpfr_##name(VALUE self) \
|
15
|
-
{ \
|
16
|
-
MP_FLOAT *self_val, *res_val; \
|
17
|
-
unsigned long prec; \
|
18
|
-
VALUE res; \
|
19
|
-
\
|
20
|
-
mpf_get_struct_prec(self, self_val, prec); \
|
21
|
-
mpf_make_struct_init(res, res_val, prec); \
|
22
|
-
mpfr_##name(res_val, self_val, __gmp_default_rounding_mode); \
|
23
|
-
\
|
24
|
-
return res; \
|
25
|
-
}
|
26
|
-
|
27
|
-
MPFR_SINGLE_FUNCTION(log)
|
28
|
-
MPFR_SINGLE_FUNCTION(exp)
|
29
|
-
MPFR_SINGLE_FUNCTION(sqrt)
|
30
|
-
MPFR_SINGLE_FUNCTION(cos)
|
31
|
-
MPFR_SINGLE_FUNCTION(sin)
|
32
|
-
MPFR_SINGLE_FUNCTION(tan)
|
33
|
-
MPFR_SINGLE_FUNCTION(acos)
|
34
|
-
MPFR_SINGLE_FUNCTION(asin)
|
35
|
-
MPFR_SINGLE_FUNCTION(atan)
|
36
|
-
MPFR_SINGLE_FUNCTION(cosh)
|
37
|
-
MPFR_SINGLE_FUNCTION(sinh)
|
38
|
-
MPFR_SINGLE_FUNCTION(tanh)
|
39
|
-
MPFR_SINGLE_FUNCTION(acosh)
|
40
|
-
MPFR_SINGLE_FUNCTION(asinh)
|
41
|
-
MPFR_SINGLE_FUNCTION(atanh)
|
42
|
-
MPFR_SINGLE_FUNCTION(log1p)
|
43
|
-
MPFR_SINGLE_FUNCTION(expm1)
|
44
|
-
MPFR_SINGLE_FUNCTION(log2)
|
45
|
-
MPFR_SINGLE_FUNCTION(log10)
|
46
|
-
|
47
|
-
static VALUE r_gmpfr_nan_p(VALUE self)
|
48
|
-
{
|
49
|
-
MP_FLOAT *self_val;
|
50
|
-
|
51
|
-
mpf_get_struct(self, self_val);
|
52
|
-
if (mpfr_nan_p(self_val)) {
|
53
|
-
return Qtrue;
|
54
|
-
}
|
55
|
-
else {
|
56
|
-
return Qfalse;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
static VALUE r_gmpfr_inf_p(VALUE self)
|
61
|
-
{
|
62
|
-
MP_FLOAT *self_val;
|
63
|
-
|
64
|
-
mpf_get_struct(self, self_val);
|
65
|
-
if (mpfr_inf_p(self_val)) {
|
66
|
-
return Qtrue;
|
67
|
-
}
|
68
|
-
else {
|
69
|
-
return Qfalse;
|
70
|
-
}
|
71
|
-
}
|
72
|
-
|
73
|
-
static VALUE r_gmpfr_fin_p(VALUE self)
|
74
|
-
{
|
75
|
-
if (r_gmpfr_inf_p(self)) {
|
76
|
-
return Qfalse;
|
77
|
-
}
|
78
|
-
else {
|
79
|
-
return Qtrue;
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
static VALUE r_gmpfr_number_p(VALUE self)
|
84
|
-
{
|
85
|
-
MP_FLOAT *self_val;
|
86
|
-
|
87
|
-
mpf_get_struct(self, self_val);
|
88
|
-
if (mpfr_number_p(self_val)) {
|
89
|
-
return Qtrue;
|
90
|
-
}
|
91
|
-
else {
|
92
|
-
return Qfalse;
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
|
-
static VALUE r_gmpfr_pow(VALUE self, VALUE arg)
|
97
|
-
{
|
98
|
-
MP_FLOAT *self_val, *res_val, *arg_val_f;
|
99
|
-
MP_RAT *arg_val_q;
|
100
|
-
MP_INT *arg_val_z;
|
101
|
-
unsigned long prec;
|
102
|
-
VALUE res;
|
103
|
-
|
104
|
-
mpf_get_struct_prec(self, self_val, prec);
|
105
|
-
|
106
|
-
if (GMPF_P(arg)) {
|
107
|
-
mpf_get_struct(arg, arg_val_f);
|
108
|
-
prec_max(prec, arg_val_f);
|
109
|
-
mpf_make_struct_init(res, res_val, prec);
|
110
|
-
mpfr_pow(res_val, self_val, arg_val_f, __gmp_default_rounding_mode);
|
111
|
-
} else {
|
112
|
-
mpf_make_struct_init(res, res_val, prec);
|
113
|
-
|
114
|
-
if (GMPZ_P(arg)) {
|
115
|
-
mpz_get_struct(arg, arg_val_z);
|
116
|
-
mpf_set_z(res_val, arg_val_z);
|
117
|
-
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
118
|
-
} else if (GMPQ_P(arg)) {
|
119
|
-
mpq_get_struct(arg, arg_val_q);
|
120
|
-
mpf_set_q(res_val, arg_val_q);
|
121
|
-
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
122
|
-
} else if (FLOAT_P(arg)) {
|
123
|
-
mpf_set_d(res_val, FLT2DBL(arg));
|
124
|
-
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
125
|
-
} else if (FIXNUM_P(arg)) {
|
126
|
-
mpfr_pow_si(res_val, self_val, FIX2INT(arg), __gmp_default_rounding_mode);
|
127
|
-
} else if (BIGNUM_P(arg)) {
|
128
|
-
mpz_temp_from_bignum(arg_val_z, arg);
|
129
|
-
mpf_set_z(res_val, arg_val_z);
|
130
|
-
mpz_temp_free(arg_val_z);
|
131
|
-
mpfr_pow(res_val, self_val, res_val, __gmp_default_rounding_mode);
|
132
|
-
} else {
|
133
|
-
typeerror(ZQFXBD);
|
134
|
-
}
|
135
|
-
|
136
|
-
}
|
137
|
-
|
138
|
-
return res;
|
139
|
-
}
|
140
|
-
|
141
|
-
#endif
|
142
|
-
|
143
|
-
|
144
12
|
#endif
|