bigdecimal 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bigdecimal.gemspec +5 -3
- data/ext/bigdecimal/bigdecimal.c +90 -49
- data/ext/bigdecimal/bigdecimal.h +6 -0
- data/ext/bigdecimal/extconf.rb +16 -0
- data/lib/bigdecimal/math.rb +2 -2
- data/lib/bigdecimal/util.rb +2 -2
- data/sample/linear.rb +11 -10
- data/sample/nlsolve.rb +5 -5
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58d7e0c80b71e36acf67381960d3bdf551aa713c
|
4
|
+
data.tar.gz: 296291e66a2b2d04e5ac9bbb5f55fc72dda16fb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70767732235c4c5594e75a2c6aeb44d5c37d4e9eaad3972744dcad4f1c236d30d872b610ee199243144d743c59a4a395532eee0f95024403f099e58338177084
|
7
|
+
data.tar.gz: 3ccbceef117a07b0cac34d0f23598a1728e94277b9a765b99458ba7d1fe7ba36cb90cac98568ced6adc84c56c6152af46d7cdc325962a0513781504967e932f5
|
data/bigdecimal.gemspec
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
|
3
|
+
bigdecimal_version = '1.3.3'
|
3
4
|
|
4
5
|
Gem::Specification.new do |s|
|
5
6
|
s.name = "bigdecimal"
|
6
|
-
s.version =
|
7
|
+
s.version = bigdecimal_version
|
7
8
|
s.authors = ["Kenta Murata", "Zachary Scott", "Shigeo Kobayashi"]
|
8
9
|
s.email = ["mrkn@mrkn.jp"]
|
9
10
|
|
@@ -31,7 +32,8 @@ Gem::Specification.new do |s|
|
|
31
32
|
]
|
32
33
|
|
33
34
|
s.add_development_dependency "rake", "~> 10.0"
|
34
|
-
s.add_development_dependency "rake-compiler", "
|
35
|
+
s.add_development_dependency "rake-compiler", ">= 0.9"
|
36
|
+
s.add_development_dependency "rake-compiler-dock", ">= 0.6.1"
|
35
37
|
s.add_development_dependency "minitest", "~> 4.7.5"
|
36
38
|
s.add_development_dependency "pry"
|
37
39
|
end
|
data/ext/bigdecimal/bigdecimal.c
CHANGED
@@ -141,12 +141,16 @@ rb_rational_den(VALUE rat)
|
|
141
141
|
static VALUE
|
142
142
|
BigDecimal_version(VALUE self)
|
143
143
|
{
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
144
|
+
/*
|
145
|
+
* 1.0.0: Ruby 1.8.0
|
146
|
+
* 1.0.1: Ruby 1.8.1
|
147
|
+
* 1.1.0: Ruby 1.9.3
|
148
|
+
*/
|
149
|
+
#ifndef RUBY_BIGDECIMAL_VERSION
|
150
|
+
# error RUBY_BIGDECIMAL_VERSION is not defined
|
151
|
+
#endif
|
152
|
+
rb_warning("BigDecimal.ver is deprecated; use BigDecimal::VERSION instead.");
|
153
|
+
return rb_str_new2(RUBY_BIGDECIMAL_VERSION);
|
150
154
|
}
|
151
155
|
|
152
156
|
/*
|
@@ -289,8 +293,9 @@ again:
|
|
289
293
|
|
290
294
|
#ifdef ENABLE_NUMERIC_STRING
|
291
295
|
case T_STRING:
|
292
|
-
|
293
|
-
|
296
|
+
StringValueCStr(v);
|
297
|
+
rb_check_safe_obj(v);
|
298
|
+
return VpCreateRbObject(RSTRING_LEN(v) + VpBaseFig() + 1,
|
294
299
|
RSTRING_PTR(v));
|
295
300
|
#endif /* ENABLE_NUMERIC_STRING */
|
296
301
|
|
@@ -384,7 +389,7 @@ BigDecimal_hash(VALUE self)
|
|
384
389
|
hash ^= rb_memhash(p->frac, sizeof(BDIGIT)*p->Prec);
|
385
390
|
hash += p->exponent;
|
386
391
|
}
|
387
|
-
return
|
392
|
+
return ST2FIX(hash);
|
388
393
|
}
|
389
394
|
|
390
395
|
/*
|
@@ -392,7 +397,7 @@ BigDecimal_hash(VALUE self)
|
|
392
397
|
*
|
393
398
|
* Method used to provide marshalling support.
|
394
399
|
*
|
395
|
-
* inf = BigDecimal
|
400
|
+
* inf = BigDecimal('Infinity')
|
396
401
|
* #=> Infinity
|
397
402
|
* BigDecimal._load(inf._dump)
|
398
403
|
* #=> Infinity
|
@@ -430,8 +435,8 @@ BigDecimal_load(VALUE self, VALUE str)
|
|
430
435
|
unsigned char ch;
|
431
436
|
unsigned long m=0;
|
432
437
|
|
433
|
-
|
434
|
-
|
438
|
+
pch = (unsigned char *)StringValueCStr(str);
|
439
|
+
rb_check_safe_obj(str);
|
435
440
|
/* First get max prec */
|
436
441
|
while((*pch) != (unsigned char)'\0' && (ch = *pch++) != (unsigned char)':') {
|
437
442
|
if(!ISDIGIT(ch)) {
|
@@ -645,12 +650,12 @@ GetAddSubPrec(Real *a, Real *b)
|
|
645
650
|
}
|
646
651
|
|
647
652
|
static SIGNED_VALUE
|
648
|
-
|
653
|
+
GetPrecisionInt(VALUE v)
|
649
654
|
{
|
650
655
|
SIGNED_VALUE n;
|
651
656
|
n = NUM2INT(v);
|
652
657
|
if (n < 0) {
|
653
|
-
rb_raise(rb_eArgError, "
|
658
|
+
rb_raise(rb_eArgError, "negative precision");
|
654
659
|
}
|
655
660
|
return n;
|
656
661
|
}
|
@@ -875,7 +880,7 @@ BigDecimal_to_r(VALUE self)
|
|
875
880
|
* be coerced into a BigDecimal value.
|
876
881
|
*
|
877
882
|
* e.g.
|
878
|
-
* a = BigDecimal
|
883
|
+
* a = BigDecimal("1.0")
|
879
884
|
* b = a / 2.0 #=> 0.5
|
880
885
|
*
|
881
886
|
* Note that coercing a String to a BigDecimal is not supported by default;
|
@@ -1164,7 +1169,7 @@ BigDecimal_comp(VALUE self, VALUE r)
|
|
1164
1169
|
*
|
1165
1170
|
* Values may be coerced to perform the comparison:
|
1166
1171
|
*
|
1167
|
-
* BigDecimal
|
1172
|
+
* BigDecimal('1.0') == 1.0 #=> true
|
1168
1173
|
*/
|
1169
1174
|
static VALUE
|
1170
1175
|
BigDecimal_eq(VALUE self, VALUE r)
|
@@ -1526,8 +1531,8 @@ BigDecimal_remainder(VALUE self, VALUE r) /* remainder */
|
|
1526
1531
|
*
|
1527
1532
|
* require 'bigdecimal'
|
1528
1533
|
*
|
1529
|
-
* a = BigDecimal
|
1530
|
-
* b = BigDecimal
|
1534
|
+
* a = BigDecimal("42")
|
1535
|
+
* b = BigDecimal("9")
|
1531
1536
|
*
|
1532
1537
|
* q, m = a.divmod(b)
|
1533
1538
|
*
|
@@ -1570,7 +1575,7 @@ BigDecimal_div2(VALUE self, VALUE b, VALUE n)
|
|
1570
1575
|
}
|
1571
1576
|
|
1572
1577
|
/* div in BigDecimal sense */
|
1573
|
-
ix =
|
1578
|
+
ix = GetPrecisionInt(n);
|
1574
1579
|
if (ix == 0) {
|
1575
1580
|
return BigDecimal_div(self, b);
|
1576
1581
|
}
|
@@ -1639,7 +1644,7 @@ BigDecimal_add2(VALUE self, VALUE b, VALUE n)
|
|
1639
1644
|
{
|
1640
1645
|
ENTER(2);
|
1641
1646
|
Real *cv;
|
1642
|
-
SIGNED_VALUE mx =
|
1647
|
+
SIGNED_VALUE mx = GetPrecisionInt(n);
|
1643
1648
|
if (mx == 0) return BigDecimal_add(self, b);
|
1644
1649
|
else {
|
1645
1650
|
size_t pl = VpSetPrecLimit(0);
|
@@ -1669,7 +1674,7 @@ BigDecimal_sub2(VALUE self, VALUE b, VALUE n)
|
|
1669
1674
|
{
|
1670
1675
|
ENTER(2);
|
1671
1676
|
Real *cv;
|
1672
|
-
SIGNED_VALUE mx =
|
1677
|
+
SIGNED_VALUE mx = GetPrecisionInt(n);
|
1673
1678
|
if (mx == 0) return BigDecimal_sub(self, b);
|
1674
1679
|
else {
|
1675
1680
|
size_t pl = VpSetPrecLimit(0);
|
@@ -1687,7 +1692,7 @@ BigDecimal_mult2(VALUE self, VALUE b, VALUE n)
|
|
1687
1692
|
{
|
1688
1693
|
ENTER(2);
|
1689
1694
|
Real *cv;
|
1690
|
-
SIGNED_VALUE mx =
|
1695
|
+
SIGNED_VALUE mx = GetPrecisionInt(n);
|
1691
1696
|
if (mx == 0) return BigDecimal_mult(self, b);
|
1692
1697
|
else {
|
1693
1698
|
size_t pl = VpSetPrecLimit(0);
|
@@ -1741,7 +1746,7 @@ BigDecimal_sqrt(VALUE self, VALUE nFig)
|
|
1741
1746
|
GUARD_OBJ(a, GetVpValue(self, 1));
|
1742
1747
|
mx = a->Prec * (VpBaseFig() + 1);
|
1743
1748
|
|
1744
|
-
n =
|
1749
|
+
n = GetPrecisionInt(nFig) + VpDblFig() + BASE_FIG;
|
1745
1750
|
if (mx <= n) mx = n;
|
1746
1751
|
GUARD_OBJ(c, VpCreateRbObject(mx, "0"));
|
1747
1752
|
VpSqrt(c, a);
|
@@ -2011,34 +2016,35 @@ BigDecimal_ceil(int argc, VALUE *argv, VALUE self)
|
|
2011
2016
|
*
|
2012
2017
|
* Examples:
|
2013
2018
|
*
|
2014
|
-
* BigDecimal
|
2019
|
+
* BigDecimal('-123.45678901234567890').to_s('5F')
|
2015
2020
|
* #=> '-123.45678 90123 45678 9'
|
2016
2021
|
*
|
2017
|
-
* BigDecimal
|
2022
|
+
* BigDecimal('123.45678901234567890').to_s('+8F')
|
2018
2023
|
* #=> '+123.45678901 23456789'
|
2019
2024
|
*
|
2020
|
-
* BigDecimal
|
2025
|
+
* BigDecimal('123.45678901234567890').to_s(' F')
|
2021
2026
|
* #=> ' 123.4567890123456789'
|
2022
2027
|
*/
|
2023
2028
|
static VALUE
|
2024
2029
|
BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
2025
2030
|
{
|
2026
2031
|
ENTER(5);
|
2027
|
-
int fmt = 0; /* 0:E format */
|
2028
|
-
int fPlus = 0; /*
|
2032
|
+
int fmt = 0; /* 0: E format, 1: F format */
|
2033
|
+
int fPlus = 0; /* 0: default, 1: set ' ' before digits, 2: set '+' before digits. */
|
2029
2034
|
Real *vp;
|
2030
2035
|
volatile VALUE str;
|
2031
2036
|
char *psz;
|
2032
2037
|
char ch;
|
2033
2038
|
size_t nc, mc = 0;
|
2039
|
+
SIGNED_VALUE m;
|
2034
2040
|
VALUE f;
|
2035
2041
|
|
2036
2042
|
GUARD_OBJ(vp, GetVpValue(self, 1));
|
2037
2043
|
|
2038
2044
|
if (rb_scan_args(argc, argv, "01", &f) == 1) {
|
2039
2045
|
if (RB_TYPE_P(f, T_STRING)) {
|
2040
|
-
|
2041
|
-
|
2046
|
+
psz = StringValueCStr(f);
|
2047
|
+
rb_check_safe_obj(f);
|
2042
2048
|
if (*psz == ' ') {
|
2043
2049
|
fPlus = 1;
|
2044
2050
|
psz++;
|
@@ -2061,7 +2067,11 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
|
|
2061
2067
|
}
|
2062
2068
|
}
|
2063
2069
|
else {
|
2064
|
-
|
2070
|
+
m = NUM2INT(f);
|
2071
|
+
if (m <= 0) {
|
2072
|
+
rb_raise(rb_eArgError, "argument must be positive");
|
2073
|
+
}
|
2074
|
+
mc = (size_t)m;
|
2065
2075
|
}
|
2066
2076
|
}
|
2067
2077
|
if (fmt) {
|
@@ -2158,7 +2168,7 @@ BigDecimal_exponent(VALUE self)
|
|
2158
2168
|
/* Returns debugging information about the value as a string of comma-separated
|
2159
2169
|
* values in angle brackets with a leading #:
|
2160
2170
|
*
|
2161
|
-
* BigDecimal
|
2171
|
+
* BigDecimal("1234.5678").inspect
|
2162
2172
|
* #=> "0.12345678e4"
|
2163
2173
|
*
|
2164
2174
|
* The first part is the address, the second is the value as a string, and
|
@@ -2589,6 +2599,13 @@ static Real *BigDecimal_new(int argc, VALUE *argv);
|
|
2589
2599
|
* ArgumentError:: If the +initial+ is a Float or Rational, and the +digits+
|
2590
2600
|
* value is omitted, this exception is raised.
|
2591
2601
|
*/
|
2602
|
+
static VALUE
|
2603
|
+
BigDecimal_s_new(int argc, VALUE *argv, VALUE self)
|
2604
|
+
{
|
2605
|
+
rb_warning("BigDecimal.new is deprecated");
|
2606
|
+
return rb_call_super(argc, argv);
|
2607
|
+
}
|
2608
|
+
|
2592
2609
|
static VALUE
|
2593
2610
|
BigDecimal_initialize(int argc, VALUE *argv, VALUE self)
|
2594
2611
|
{
|
@@ -2625,6 +2642,20 @@ BigDecimal_initialize_copy(VALUE self, VALUE other)
|
|
2625
2642
|
return self;
|
2626
2643
|
}
|
2627
2644
|
|
2645
|
+
static VALUE
|
2646
|
+
BigDecimal_clone(VALUE self)
|
2647
|
+
{
|
2648
|
+
rb_warning("BigDecimal#clone is deprecated.");
|
2649
|
+
return rb_call_super(0, NULL);
|
2650
|
+
}
|
2651
|
+
|
2652
|
+
static VALUE
|
2653
|
+
BigDecimal_dup(VALUE self)
|
2654
|
+
{
|
2655
|
+
rb_warning("BigDecimal#dup is deprecated.");
|
2656
|
+
return rb_call_super(0, NULL);
|
2657
|
+
}
|
2658
|
+
|
2628
2659
|
static Real *
|
2629
2660
|
BigDecimal_new(int argc, VALUE *argv)
|
2630
2661
|
{
|
@@ -2637,7 +2668,7 @@ BigDecimal_new(int argc, VALUE *argv)
|
|
2637
2668
|
mf = 0;
|
2638
2669
|
}
|
2639
2670
|
else {
|
2640
|
-
mf =
|
2671
|
+
mf = GetPrecisionInt(nFig);
|
2641
2672
|
}
|
2642
2673
|
|
2643
2674
|
switch (TYPE(iniValue)) {
|
@@ -2757,9 +2788,9 @@ BigDecimal_sign(VALUE self)
|
|
2757
2788
|
* BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, false)
|
2758
2789
|
* BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
|
2759
2790
|
*
|
2760
|
-
* BigDecimal
|
2761
|
-
* BigDecimal
|
2762
|
-
* BigDecimal(BigDecimal
|
2791
|
+
* BigDecimal(BigDecimal('Infinity'))
|
2792
|
+
* BigDecimal(BigDecimal('-Infinity'))
|
2793
|
+
* BigDecimal(BigDecimal('NaN'))
|
2763
2794
|
* end
|
2764
2795
|
*
|
2765
2796
|
* For use with the BigDecimal::EXCEPTION_*
|
@@ -3146,15 +3177,15 @@ get_vp_value:
|
|
3146
3177
|
*
|
3147
3178
|
* require 'bigdecimal'
|
3148
3179
|
*
|
3149
|
-
* sum = BigDecimal
|
3180
|
+
* sum = BigDecimal("0")
|
3150
3181
|
* 10_000.times do
|
3151
|
-
* sum = sum + BigDecimal
|
3182
|
+
* sum = sum + BigDecimal("0.0001")
|
3152
3183
|
* end
|
3153
3184
|
* print sum #=> 0.1E1
|
3154
3185
|
*
|
3155
3186
|
* Similarly:
|
3156
3187
|
*
|
3157
|
-
* (BigDecimal
|
3188
|
+
* (BigDecimal("1.2") - BigDecimal("1.0")) == BigDecimal("0.2") #=> true
|
3158
3189
|
*
|
3159
3190
|
* (1.2 - 1.0) == 0.2 #=> false
|
3160
3191
|
*
|
@@ -3168,8 +3199,8 @@ get_vp_value:
|
|
3168
3199
|
* BigDecimal sometimes needs to return infinity, for example if you divide
|
3169
3200
|
* a value by zero.
|
3170
3201
|
*
|
3171
|
-
* BigDecimal
|
3172
|
-
* BigDecimal
|
3202
|
+
* BigDecimal("1.0") / BigDecimal("0.0") #=> Infinity
|
3203
|
+
* BigDecimal("-1.0") / BigDecimal("0.0") #=> -Infinity
|
3173
3204
|
*
|
3174
3205
|
* You can represent infinite numbers to BigDecimal using the strings
|
3175
3206
|
* <code>'Infinity'</code>, <code>'+Infinity'</code> and
|
@@ -3182,13 +3213,13 @@ get_vp_value:
|
|
3182
3213
|
*
|
3183
3214
|
* Example:
|
3184
3215
|
*
|
3185
|
-
* BigDecimal
|
3216
|
+
* BigDecimal("0.0") / BigDecimal("0.0") #=> NaN
|
3186
3217
|
*
|
3187
3218
|
* You can also create undefined values.
|
3188
3219
|
*
|
3189
3220
|
* NaN is never considered to be the same as any other value, even NaN itself:
|
3190
3221
|
*
|
3191
|
-
* n = BigDecimal
|
3222
|
+
* n = BigDecimal('NaN')
|
3192
3223
|
* n == 0.0 #=> false
|
3193
3224
|
* n == n #=> false
|
3194
3225
|
*
|
@@ -3201,11 +3232,11 @@ get_vp_value:
|
|
3201
3232
|
* If the value which is too small to be represented is negative, a BigDecimal
|
3202
3233
|
* value of negative zero is returned.
|
3203
3234
|
*
|
3204
|
-
* BigDecimal
|
3235
|
+
* BigDecimal("1.0") / BigDecimal("-Infinity") #=> -0.0
|
3205
3236
|
*
|
3206
3237
|
* If the value is positive, a value of positive zero is returned.
|
3207
3238
|
*
|
3208
|
-
* BigDecimal
|
3239
|
+
* BigDecimal("1.0") / BigDecimal("Infinity") #=> 0.0
|
3209
3240
|
*
|
3210
3241
|
* (See BigDecimal.mode for how to specify limits of precision.)
|
3211
3242
|
*
|
@@ -3260,6 +3291,7 @@ Init_bigdecimal(void)
|
|
3260
3291
|
rb_define_global_function("BigDecimal", BigDecimal_global_new, -1);
|
3261
3292
|
|
3262
3293
|
/* Class methods */
|
3294
|
+
rb_define_singleton_method(rb_cBigDecimal, "new", BigDecimal_s_new, -1);
|
3263
3295
|
rb_define_singleton_method(rb_cBigDecimal, "mode", BigDecimal_mode, -1);
|
3264
3296
|
rb_define_singleton_method(rb_cBigDecimal, "limit", BigDecimal_limit, -1);
|
3265
3297
|
rb_define_singleton_method(rb_cBigDecimal, "double_fig", BigDecimal_double_fig, 0);
|
@@ -3272,6 +3304,14 @@ Init_bigdecimal(void)
|
|
3272
3304
|
|
3273
3305
|
/* Constants definition */
|
3274
3306
|
|
3307
|
+
#ifndef RUBY_BIGDECIMAL_VERSION
|
3308
|
+
# error RUBY_BIGDECIMAL_VERSION is not defined
|
3309
|
+
#endif
|
3310
|
+
/*
|
3311
|
+
* The version of bigdecimal library
|
3312
|
+
*/
|
3313
|
+
rb_define_const(rb_cBigDecimal, "VERSION", rb_str_new2(RUBY_BIGDECIMAL_VERSION));
|
3314
|
+
|
3275
3315
|
/*
|
3276
3316
|
* Base value used in internal calculations. On a 32 bit system, BASE
|
3277
3317
|
* is 10000, indicating that calculation is done in groups of 4 digits.
|
@@ -3408,7 +3448,8 @@ Init_bigdecimal(void)
|
|
3408
3448
|
rb_define_method(rb_cBigDecimal, "modulo", BigDecimal_mod, 1);
|
3409
3449
|
rb_define_method(rb_cBigDecimal, "remainder", BigDecimal_remainder, 1);
|
3410
3450
|
rb_define_method(rb_cBigDecimal, "divmod", BigDecimal_divmod, 1);
|
3411
|
-
|
3451
|
+
rb_define_method(rb_cBigDecimal, "clone", BigDecimal_clone, 0);
|
3452
|
+
rb_define_method(rb_cBigDecimal, "dup", BigDecimal_dup, 0);
|
3412
3453
|
rb_define_method(rb_cBigDecimal, "to_f", BigDecimal_to_f, 0);
|
3413
3454
|
rb_define_method(rb_cBigDecimal, "abs", BigDecimal_abs, 0);
|
3414
3455
|
rb_define_method(rb_cBigDecimal, "sqrt", BigDecimal_sqrt, 1);
|
@@ -5347,7 +5388,7 @@ VpSzMantissa(Real *a,char *psz)
|
|
5347
5388
|
|
5348
5389
|
VP_EXPORT int
|
5349
5390
|
VpToSpecialString(Real *a,char *psz,int fPlus)
|
5350
|
-
|
5391
|
+
/* fPlus = 0: default, 1: set ' ' before digits, 2: set '+' before digits. */
|
5351
5392
|
{
|
5352
5393
|
if (VpIsNaN(a)) {
|
5353
5394
|
sprintf(psz,SZ_NaN);
|
@@ -5382,7 +5423,7 @@ VpToSpecialString(Real *a,char *psz,int fPlus)
|
|
5382
5423
|
|
5383
5424
|
VP_EXPORT void
|
5384
5425
|
VpToString(Real *a, char *psz, size_t fFmt, int fPlus)
|
5385
|
-
/* fPlus =0:default,
|
5426
|
+
/* fPlus = 0: default, 1: set ' ' before digits, 2: set '+' before digits. */
|
5386
5427
|
{
|
5387
5428
|
size_t i, n, ZeroSup;
|
5388
5429
|
BDIGIT shift, m, e, nn;
|
@@ -5430,7 +5471,7 @@ VpToString(Real *a, char *psz, size_t fFmt, int fPlus)
|
|
5430
5471
|
|
5431
5472
|
VP_EXPORT void
|
5432
5473
|
VpToFString(Real *a, char *psz, size_t fFmt, int fPlus)
|
5433
|
-
/* fPlus =0:default
|
5474
|
+
/* fPlus = 0: default, 1: set ' ' before digits, 2: set '+' before digits. */
|
5434
5475
|
{
|
5435
5476
|
size_t i, n;
|
5436
5477
|
BDIGIT m, e, nn;
|
data/ext/bigdecimal/bigdecimal.h
CHANGED
data/ext/bigdecimal/extconf.rb
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
# frozen_string_literal: false
|
2
2
|
require 'mkmf'
|
3
3
|
|
4
|
+
case
|
5
|
+
when File.file?(File.expand_path('../bigdecimal.gemspec', __FILE__))
|
6
|
+
gemspec_path = File.expand_path('../bigdecimal.gemspec', __FILE__)
|
7
|
+
when File.file?(File.expand_path('../../../bigdecimal.gemspec', __FILE__))
|
8
|
+
gemspec_path = File.expand_path('../../../bigdecimal.gemspec', __FILE__)
|
9
|
+
else
|
10
|
+
$stderr.puts "Unable to find bigdecimal.gemspec"
|
11
|
+
abort
|
12
|
+
end
|
13
|
+
|
14
|
+
bigdecimal_version =
|
15
|
+
IO.readlines(gemspec_path)
|
16
|
+
.grep(/\Abigdecimal_version\s+=\s+/)[0][/\'([\d\.]+)\'/, 1]
|
17
|
+
|
18
|
+
$defs << %Q[-DRUBY_BIGDECIMAL_VERSION=\\"#{bigdecimal_version}\\"]
|
19
|
+
|
4
20
|
alias __have_macro__ have_macro
|
5
21
|
|
6
22
|
have_func("labs", "stdlib.h")
|
data/lib/bigdecimal/math.rb
CHANGED
@@ -37,7 +37,7 @@ module BigMath
|
|
37
37
|
# Computes the square root of +decimal+ to the specified number of digits of
|
38
38
|
# precision, +numeric+.
|
39
39
|
#
|
40
|
-
# BigMath.sqrt(BigDecimal
|
40
|
+
# BigMath.sqrt(BigDecimal('2'), 16).to_s
|
41
41
|
# #=> "0.1414213562373095048801688724e1"
|
42
42
|
#
|
43
43
|
def sqrt(x, prec)
|
@@ -140,7 +140,7 @@ module BigMath
|
|
140
140
|
#
|
141
141
|
# If +decimal+ is NaN, returns NaN.
|
142
142
|
#
|
143
|
-
# BigMath.atan(BigDecimal
|
143
|
+
# BigMath.atan(BigDecimal('-1'), 16).to_s
|
144
144
|
# #=> "-0.785398163397448309615660845819878471907514682065e0"
|
145
145
|
#
|
146
146
|
def atan(x, prec)
|
data/lib/bigdecimal/util.rb
CHANGED
@@ -83,7 +83,7 @@ class BigDecimal < Numeric
|
|
83
83
|
#
|
84
84
|
# require 'bigdecimal/util'
|
85
85
|
#
|
86
|
-
# d = BigDecimal
|
86
|
+
# d = BigDecimal("3.14")
|
87
87
|
# d.to_digits # => "3.14"
|
88
88
|
#
|
89
89
|
def to_digits
|
@@ -103,7 +103,7 @@ class BigDecimal < Numeric
|
|
103
103
|
#
|
104
104
|
# require 'bigdecimal/util'
|
105
105
|
#
|
106
|
-
# d = BigDecimal
|
106
|
+
# d = BigDecimal("3.14")
|
107
107
|
# d.to_d # => 0.314e1
|
108
108
|
#
|
109
109
|
def to_d
|
data/sample/linear.rb
CHANGED
@@ -28,8 +28,8 @@ def rd_order(na)
|
|
28
28
|
end
|
29
29
|
|
30
30
|
na = ARGV.size
|
31
|
-
zero = BigDecimal
|
32
|
-
one = BigDecimal
|
31
|
+
zero = BigDecimal("0.0")
|
32
|
+
one = BigDecimal("1.0")
|
33
33
|
|
34
34
|
while (n=rd_order(na))>0
|
35
35
|
a = []
|
@@ -37,27 +37,28 @@ while (n=rd_order(na))>0
|
|
37
37
|
b = []
|
38
38
|
if na <= 0
|
39
39
|
# Read data from console.
|
40
|
-
printf("\nEnter coefficient matrix element A[i,j]\n")
|
40
|
+
printf("\nEnter coefficient matrix element A[i,j]\n")
|
41
41
|
for i in 0...n do
|
42
42
|
for j in 0...n do
|
43
43
|
printf("A[%d,%d]? ",i,j); s = ARGF.gets
|
44
|
-
a << BigDecimal
|
45
|
-
as << BigDecimal
|
44
|
+
a << BigDecimal(s)
|
45
|
+
as << BigDecimal(s)
|
46
46
|
end
|
47
|
-
printf("Contatant vector element b[%d] ? ",i)
|
47
|
+
printf("Contatant vector element b[%d] ? ",i)
|
48
|
+
b << BigDecimal(ARGF.gets)
|
48
49
|
end
|
49
50
|
else
|
50
51
|
# Read data from specified file.
|
51
|
-
printf("Coefficient matrix and constant vector.\n")
|
52
|
+
printf("Coefficient matrix and constant vector.\n")
|
52
53
|
for i in 0...n do
|
53
54
|
s = ARGF.gets
|
54
55
|
printf("%d) %s",i,s)
|
55
56
|
s = s.split
|
56
57
|
for j in 0...n do
|
57
|
-
a << BigDecimal
|
58
|
-
as << BigDecimal
|
58
|
+
a << BigDecimal(s[j])
|
59
|
+
as << BigDecimal(s[j])
|
59
60
|
end
|
60
|
-
b << BigDecimal
|
61
|
+
b << BigDecimal(s[n])
|
61
62
|
end
|
62
63
|
end
|
63
64
|
x = lusolve(a,b,ludecomp(a,n,zero,one),zero)
|
data/sample/nlsolve.rb
CHANGED
@@ -12,11 +12,11 @@ include Newton
|
|
12
12
|
|
13
13
|
class Function # :nodoc: all
|
14
14
|
def initialize()
|
15
|
-
@zero = BigDecimal
|
16
|
-
@one = BigDecimal
|
17
|
-
@two = BigDecimal
|
18
|
-
@ten = BigDecimal
|
19
|
-
@eps = BigDecimal
|
15
|
+
@zero = BigDecimal("0.0")
|
16
|
+
@one = BigDecimal("1.0")
|
17
|
+
@two = BigDecimal("2.0")
|
18
|
+
@ten = BigDecimal("10.0")
|
19
|
+
@eps = BigDecimal("1.0e-16")
|
20
20
|
end
|
21
21
|
def zero;@zero;end
|
22
22
|
def one ;@one ;end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bigdecimal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenta Murata
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-12-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -30,16 +30,30 @@ dependencies:
|
|
30
30
|
name: rake-compiler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '0.9'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0.9'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rake-compiler-dock
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.6.1
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.6.1
|
43
57
|
- !ruby/object:Gem::Dependency
|
44
58
|
name: minitest
|
45
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
124
|
version: '0'
|
111
125
|
requirements: []
|
112
126
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.6.
|
127
|
+
rubygems_version: 2.6.14
|
114
128
|
signing_key:
|
115
129
|
specification_version: 4
|
116
130
|
summary: Arbitrary-precision decimal floating-point number library.
|