bigdecimal 3.1.7 → 3.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bd666f800ebaf8bf81b991c2220587d621521c6d02548680bfbb4ff55b245b7
4
- data.tar.gz: 15be279642ac5dd98f2470df7a46fc288992b450a1d5f1629d52c701377d191d
3
+ metadata.gz: 61cbb7233c53f76dca23b078090706faa4c5796f983d9b0bf207bb2d6c652625
4
+ data.tar.gz: d7f68a343595d21e009f43ac47558d1805e004cefb85e6d0d423e46b307ba9fa
5
5
  SHA512:
6
- metadata.gz: 123b9d9b3b3a5d9ab3664b2887cee0d846f8b9a1e87d590e06751a844759e31e4286b28ad578e6fb14b4975890ed7179cbfbc660196b6cb3c23f9cb8e7eddb16
7
- data.tar.gz: 6ad102cec32ddceb2c6c19fdb4821bda9fe9c3c0e07b4b3d3eb8b98ce9b3ec60d887d1446efecce0d86675b02d5138a11028ea1bd2cd494ddc3a836082e9ba7a
6
+ metadata.gz: 1b091bed99353940b359a3d4ba6639f67cfad6859efda3709007aec5310539c0159d333ee5fb425cdecde146d2bd4241b6e208ee273cde337f449d467a7593e4
7
+ data.tar.gz: 0fa14bd118018db4d4b436375f804d62e6c894458a3fa555cafc2c8da2888bd03dea8206e3ce15a73f82b35afcd6c8285881d2c76acb14e9013cf1e72f7284c3
data/bigdecimal.gemspec CHANGED
@@ -52,4 +52,6 @@ Gem::Specification.new do |s|
52
52
  end
53
53
 
54
54
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
55
+
56
+ s.metadata["changelog_uri"] = s.homepage + "/blob/master/CHANGES.md"
55
57
  end
@@ -31,7 +31,7 @@
31
31
  #include "bits.h"
32
32
  #include "static_assert.h"
33
33
 
34
- #define BIGDECIMAL_VERSION "3.1.7"
34
+ #define BIGDECIMAL_VERSION "3.1.9"
35
35
 
36
36
  /* #define ENABLE_NUMERIC_STRING */
37
37
 
@@ -1780,6 +1780,17 @@ BigDecimal_neg(VALUE self)
1780
1780
  return VpCheckGetValue(c);
1781
1781
  }
1782
1782
 
1783
+ /*
1784
+ * call-seq:
1785
+ * a * b -> bigdecimal
1786
+ *
1787
+ * Multiply by the specified value.
1788
+ *
1789
+ * The result precision will be the precision of the sum of each precision.
1790
+ *
1791
+ * See BigDecimal#mult.
1792
+ */
1793
+
1783
1794
  static VALUE
1784
1795
  BigDecimal_mult(VALUE self, VALUE r)
1785
1796
  {
@@ -2448,7 +2459,7 @@ BigDecimal_fix(VALUE self)
2448
2459
  * round(n, mode)
2449
2460
  *
2450
2461
  * Round to the nearest integer (by default), returning the result as a
2451
- * BigDecimal if n is specified, or as an Integer if it isn't.
2462
+ * BigDecimal if n is specified and positive, or as an Integer if it isn't.
2452
2463
  *
2453
2464
  * BigDecimal('3.14159').round #=> 3
2454
2465
  * BigDecimal('8.7').round #=> 9
@@ -2456,6 +2467,7 @@ BigDecimal_fix(VALUE self)
2456
2467
  *
2457
2468
  * BigDecimal('3.14159').round(2).class.name #=> "BigDecimal"
2458
2469
  * BigDecimal('3.14159').round.class.name #=> "Integer"
2470
+ * BigDecimal('3.14159').round(0).class.name #=> "Integer"
2459
2471
  *
2460
2472
  * If n is specified and positive, the fractional part of the result has no
2461
2473
  * more than that many digits.
@@ -3257,10 +3269,11 @@ BigDecimal_initialize_copy(VALUE self, VALUE other)
3257
3269
  return self;
3258
3270
  }
3259
3271
 
3272
+ /* :nodoc: */
3260
3273
  static VALUE
3261
3274
  BigDecimal_clone(VALUE self)
3262
3275
  {
3263
- return self;
3276
+ return self;
3264
3277
  }
3265
3278
 
3266
3279
  #ifdef HAVE_RB_OPTS_EXCEPTION_P
@@ -3758,6 +3771,12 @@ f_BigDecimal(int argc, VALUE *argv, VALUE self)
3758
3771
  return rb_convert_to_BigDecimal(val, digs, exception);
3759
3772
  }
3760
3773
 
3774
+ /* call-seq:
3775
+ * BigDecimal.interpret_loosely(string) -> bigdecimal
3776
+ *
3777
+ * Returns the +BigDecimal+ converted loosely from +string+.
3778
+ */
3779
+
3761
3780
  static VALUE
3762
3781
  BigDecimal_s_interpret_loosely(VALUE klass, VALUE str)
3763
3782
  {
@@ -4238,6 +4257,17 @@ BigDecimal_negative_zero(void)
4238
4257
  return BIGDECIMAL_NEGATIVE_ZERO;
4239
4258
  }
4240
4259
 
4260
+ static inline VALUE
4261
+ BigDecimal_literal(const char *str)
4262
+ {
4263
+ VALUE arg = rb_str_new_cstr(str);
4264
+ VALUE val = f_BigDecimal(1, &arg, rb_cBigDecimal);
4265
+ rb_gc_register_mark_object(val);
4266
+ return val;
4267
+ }
4268
+
4269
+ #define BIGDECIMAL_LITERAL(var, val) (BIGDECIMAL_ ## var = BigDecimal_literal(#val))
4270
+
4241
4271
  /* Document-class: BigDecimal
4242
4272
  * BigDecimal provides arbitrary-precision floating point decimal arithmetic.
4243
4273
  *
@@ -4394,7 +4424,6 @@ Init_bigdecimal(void)
4394
4424
  #ifdef HAVE_RB_EXT_RACTOR_SAFE
4395
4425
  rb_ext_ractor_safe(true);
4396
4426
  #endif
4397
- VALUE arg;
4398
4427
 
4399
4428
  id_BigDecimal_exception_mode = rb_intern_const("BigDecimal.exception_mode");
4400
4429
  id_BigDecimal_rounding_mode = rb_intern_const("BigDecimal.rounding_mode");
@@ -4532,33 +4561,19 @@ Init_bigdecimal(void)
4532
4561
  rb_define_const(rb_cBigDecimal, "SIGN_NEGATIVE_INFINITE", INT2FIX(VP_SIGN_NEGATIVE_INFINITE));
4533
4562
 
4534
4563
  /* Positive zero value. */
4535
- arg = rb_str_new2("+0");
4536
- BIGDECIMAL_POSITIVE_ZERO = f_BigDecimal(1, &arg, rb_cBigDecimal);
4537
- rb_gc_register_mark_object(BIGDECIMAL_POSITIVE_ZERO);
4564
+ BIGDECIMAL_LITERAL(POSITIVE_ZERO, +0);
4538
4565
 
4539
4566
  /* Negative zero value. */
4540
- arg = rb_str_new2("-0");
4541
- BIGDECIMAL_NEGATIVE_ZERO = f_BigDecimal(1, &arg, rb_cBigDecimal);
4542
- rb_gc_register_mark_object(BIGDECIMAL_NEGATIVE_ZERO);
4567
+ BIGDECIMAL_LITERAL(NEGATIVE_ZERO, -0);
4543
4568
 
4544
- /* Positive infinity value. */
4545
- arg = rb_str_new2("+Infinity");
4546
- BIGDECIMAL_POSITIVE_INFINITY = f_BigDecimal(1, &arg, rb_cBigDecimal);
4547
- rb_gc_register_mark_object(BIGDECIMAL_POSITIVE_INFINITY);
4569
+ /* Positive infinity[rdoc-ref:BigDecimal@Infinity] value. */
4570
+ rb_define_const(rb_cBigDecimal, "INFINITY", BIGDECIMAL_LITERAL(POSITIVE_INFINITY, +Infinity));
4548
4571
 
4549
4572
  /* Negative infinity value. */
4550
- arg = rb_str_new2("-Infinity");
4551
- BIGDECIMAL_NEGATIVE_INFINITY = f_BigDecimal(1, &arg, rb_cBigDecimal);
4552
- rb_gc_register_mark_object(BIGDECIMAL_NEGATIVE_INFINITY);
4573
+ BIGDECIMAL_LITERAL(NEGATIVE_INFINITY, -Infinity);
4553
4574
 
4554
- /* 'Not a Number' value. */
4555
- arg = rb_str_new2("NaN");
4556
- BIGDECIMAL_NAN = f_BigDecimal(1, &arg, rb_cBigDecimal);
4557
- rb_gc_register_mark_object(BIGDECIMAL_NAN);
4558
-
4559
- /* Special value constants */
4560
- rb_define_const(rb_cBigDecimal, "INFINITY", BIGDECIMAL_POSITIVE_INFINITY);
4561
- rb_define_const(rb_cBigDecimal, "NAN", BIGDECIMAL_NAN);
4575
+ /* '{Not a Number}[rdoc-ref:BigDecimal@Not+a+Number]' value. */
4576
+ rb_define_const(rb_cBigDecimal, "NAN", BIGDECIMAL_LITERAL(NAN, NaN));
4562
4577
 
4563
4578
  /* instance methods */
4564
4579
  rb_define_method(rb_cBigDecimal, "precs", BigDecimal_prec, 0);
@@ -5203,6 +5218,48 @@ bigdecimal_parse_special_string(const char *str)
5203
5218
  return NULL;
5204
5219
  }
5205
5220
 
5221
+ struct VpCtoV_args {
5222
+ Real *a;
5223
+ const char *int_chr;
5224
+ size_t ni;
5225
+ const char *frac;
5226
+ size_t nf;
5227
+ const char *exp_chr;
5228
+ size_t ne;
5229
+ };
5230
+
5231
+ static VALUE
5232
+ call_VpCtoV(VALUE arg)
5233
+ {
5234
+ struct VpCtoV_args *x = (struct VpCtoV_args *)arg;
5235
+ return (VALUE)VpCtoV(x->a, x->int_chr, x->ni, x->frac, x->nf, x->exp_chr, x->ne);
5236
+ }
5237
+
5238
+ static int
5239
+ protected_VpCtoV(Real *a, const char *int_chr, size_t ni, const char *frac, size_t nf, const char *exp_chr, size_t ne, int free_on_error)
5240
+ {
5241
+ struct VpCtoV_args args;
5242
+ int state = 0;
5243
+
5244
+ args.a = a;
5245
+ args.int_chr = int_chr;
5246
+ args.ni = ni;
5247
+ args.frac = frac;
5248
+ args.nf = nf;
5249
+ args.exp_chr = exp_chr;
5250
+ args.ne = ne;
5251
+
5252
+ VALUE result = rb_protect(call_VpCtoV, (VALUE)&args, &state);
5253
+ if (state) {
5254
+ if (free_on_error) {
5255
+ rbd_free_struct(a);
5256
+ }
5257
+ rb_jump_tag(state);
5258
+ }
5259
+
5260
+ return (int)result;
5261
+ }
5262
+
5206
5263
  /*
5207
5264
  * Allocates variable.
5208
5265
  * [Input]
@@ -5220,7 +5277,7 @@ VP_EXPORT Real *
5220
5277
  VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
5221
5278
  {
5222
5279
  const char *orig_szVal = szVal;
5223
- size_t i, j, ni, ipf, nf, ipe, ne, dot_seen, exp_seen, nalloc;
5280
+ size_t i, j, ni, ipf, nf, ipe, ne, exp_seen, nalloc;
5224
5281
  size_t len;
5225
5282
  char v, *psz;
5226
5283
  int sign=1;
@@ -5306,13 +5363,11 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
5306
5363
  ne = 0; /* number of digits in the exponential part */
5307
5364
  ipf = 0; /* index of the beginning of the fractional part */
5308
5365
  ipe = 0; /* index of the beginning of the exponential part */
5309
- dot_seen = 0;
5310
5366
  exp_seen = 0;
5311
5367
 
5312
5368
  if (v != '\0') {
5313
5369
  /* Scanning fractional part */
5314
5370
  if ((psz[i] = szVal[j]) == '.') {
5315
- dot_seen = 1;
5316
5371
  ++i;
5317
5372
  ++j;
5318
5373
  ipf = i;
@@ -5328,9 +5383,6 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
5328
5383
  }
5329
5384
  if (!strict_p) {
5330
5385
  v = psz[i] = '\0';
5331
- if (nf == 0) {
5332
- dot_seen = 0;
5333
- }
5334
5386
  break;
5335
5387
  }
5336
5388
  goto invalid_value;
@@ -5401,7 +5453,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
5401
5453
 
5402
5454
  psz[i] = '\0';
5403
5455
 
5404
- if (strict_p && (((ni == 0 || dot_seen) && nf == 0) || (exp_seen && ne == 0))) {
5456
+ if (strict_p && ((ni == 0 && nf == 0) || (exp_seen && ne == 0))) {
5405
5457
  VALUE str;
5406
5458
  invalid_value:
5407
5459
  if (!strict_p) {
@@ -5422,7 +5474,7 @@ VpAlloc(size_t mx, const char *szVal, int strict_p, int exc)
5422
5474
  vp = rbd_allocate_struct(len);
5423
5475
  vp->MaxPrec = len; /* set max precision */
5424
5476
  VpSetZero(vp, sign);
5425
- VpCtoV(vp, psz, ni, psz + ipf, nf, psz + ipe, ne);
5477
+ protected_VpCtoV(vp, psz, ni, psz + ipf, nf, psz + ipe, ne, true);
5426
5478
  rb_str_resize(buf, 0);
5427
5479
  return vp;
5428
5480
  }
@@ -24,15 +24,17 @@ have_header("math.h")
24
24
  have_header("stdbool.h")
25
25
  have_header("stdlib.h")
26
26
 
27
- have_header("x86intrin.h")
28
- have_func("_lzcnt_u32", "x86intrin.h")
29
- have_func("_lzcnt_u64", "x86intrin.h")
30
-
31
- have_header("intrin.h")
32
- have_func("__lzcnt", "intrin.h")
33
- have_func("__lzcnt64", "intrin.h")
34
- have_func("_BitScanReverse", "intrin.h")
35
- have_func("_BitScanReverse64", "intrin.h")
27
+ if have_header("x86intrin.h")
28
+ have_func("_lzcnt_u32", "x86intrin.h")
29
+ have_func("_lzcnt_u64", "x86intrin.h")
30
+ end
31
+
32
+ if have_header("intrin.h")
33
+ have_func("__lzcnt", "intrin.h")
34
+ have_func("__lzcnt64", "intrin.h")
35
+ have_func("_BitScanReverse", "intrin.h")
36
+ have_func("_BitScanReverse64", "intrin.h")
37
+ end
36
38
 
37
39
  have_func("labs", "stdlib.h")
38
40
  have_func("llabs", "stdlib.h")
@@ -15,7 +15,8 @@
15
15
  _Pragma("GCC diagnostic push") \
16
16
  _Pragma("GCC diagnostic ignored \"-Wattributes\"") \
17
17
  __attribute__((__no_sanitize__(x))) y; \
18
- _Pragma("GCC diagnostic pop")
18
+ _Pragma("GCC diagnostic pop") \
19
+ y
19
20
  #endif
20
21
 
21
22
  #undef strtod
@@ -155,7 +155,7 @@ class Complex < Numeric
155
155
  # See also Kernel.BigDecimal.
156
156
  #
157
157
  def to_d(*args)
158
- BigDecimal(self) unless self.imag.zero? # to raise eerror
158
+ BigDecimal(self) unless self.imag.zero? # to raise error
159
159
 
160
160
  if args.length == 0
161
161
  case self.real
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: 3.1.7
4
+ version: 3.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenta Murata
@@ -9,7 +9,7 @@ authors:
9
9
  - Shigeo Kobayashi
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-03-14 00:00:00.000000000 Z
12
+ date: 2024-12-25 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: This library provides arbitrary-precision decimal floating-point number
15
15
  class.
@@ -44,7 +44,8 @@ homepage: https://github.com/ruby/bigdecimal
44
44
  licenses:
45
45
  - Ruby
46
46
  - BSD-2-Clause
47
- metadata: {}
47
+ metadata:
48
+ changelog_uri: https://github.com/ruby/bigdecimal/blob/master/CHANGES.md
48
49
  rdoc_options: []
49
50
  require_paths:
50
51
  - lib
@@ -59,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
60
  - !ruby/object:Gem::Version
60
61
  version: '0'
61
62
  requirements: []
62
- rubygems_version: 3.6.0.dev
63
+ rubygems_version: 3.6.2
63
64
  specification_version: 4
64
65
  summary: Arbitrary-precision decimal floating-point number library.
65
66
  test_files: []