Commit graph

368 commits

Author SHA1 Message Date
Kenta Murata
7db195d521
[ruby/bigdecimal] Fix the maximum precision of the quotient
Fixes https://github.com/ruby/bigdecimal/pull/220

127a1b5a31
2022-01-24 10:56:30 +09:00
Kenta Murata
9ccfc78346 [ruby/bigdecimal] Remove unused variable
ac7daa5f15
2021-12-24 09:44:23 +09:00
Kenta Murata
a1d9fbef05
[ruby/bigdecimal] Fix the result precision of BigDecimal#divmod
a32f6cb9e2
2021-12-24 02:29:01 +09:00
Burdette Lamar
0262f34905
[ruby/bigdecimal] Enhanced RDoc for BigDecimal (https://github.com/ruby/bigdecimal/pull/209)
* Enhanced RDoc for BigDecimal

* Update ext/bigdecimal/bigdecimal.c

Remove the instance number of `Float::DIG`.

* Update ext/bigdecimal/bigdecimal.c

Add BigDecimal call-seq without ndigits.

* Update ext/bigdecimal/bigdecimal.c

Replace the word sum with value or result in the description of BigDecimal().

* Update ext/bigdecimal/bigdecimal.c

Remove the instance value of Float::DIG.

* Update ext/bigdecimal/bigdecimal.c

Fix mis-description of precision

* Update ext/bigdecimal/bigdecimal.c

Fix the description of precision determination

* Update ext/bigdecimal/bigdecimal.c

Add the description of the precision in the Rational case.

acabb132a4

Co-authored-by: Kenta Murata <3959+mrkn@users.noreply.github.com>
2021-12-24 02:29:01 +09:00
Kenta Murata
79712fc083
[ruby/bigdecimal] Let BigDecimal#quo accept precision
Fix GH-214.

13e0e93f37
2021-12-24 02:29:00 +09:00
Kenta Murata
0b8638cd74
[ruby/bigdecimal] Add TODO comment
ef9cf4e69e
2021-12-24 02:29:00 +09:00
Kenta Murata
98918209b7
[ruby/bigdecimal] Allow passing both float and precision in BigDecimal#div
Fix GH-212.

900bb7fcf5
2021-12-24 02:29:00 +09:00
Kenta Murata
84ae7a5df9
[ruby/bigdecimal] Add BigDecimal#precision_scale
c019caeaba
2021-12-24 02:28:59 +09:00
Kenta Murata
ea713009ba
[ruby/bigdecimal] [Doc] Add documentation of BigDecimal#n_significant_digits
ceaf16b03e
2021-12-24 02:28:59 +09:00
Kenta Murata
aca96f7ec7
[ruby/bigdecimal] Add BigDecimal#scale
Fixes GH-198.

4fbec55680
2021-12-24 02:28:58 +09:00
BurdetteLamar
0c63aa11bc
[ruby/bigdecimal] Set rounding mode in example
8fc83dd2fe
2021-12-24 02:28:58 +09:00
BurdetteLamar
a8243d07e1
[ruby/bigdecimal] Set rounding mode in example
42c999f728
2021-12-24 02:28:57 +09:00
BurdetteLamar
de5c14d4d8
[ruby/bigdecimal] Enhanced RDoc for selected methods
0de9298d15
2021-12-24 02:28:57 +09:00
BurdetteLamar
e043829a7f
[ruby/bigdecimal] Enhanced RDoc for selected methods
6139ea1092
2021-12-24 02:28:57 +09:00
Kenta Murata
d905abb457
[ruby/bigdecimal] Fix BigDecimal#precision for single DECDIG case
Fix GH-205

7d198394a2
2021-12-24 02:28:56 +09:00
Kenta Murata
38e98cbdb7
[ruby/bigdecimal] Keep obj-to-Real link when VpReallocReal returns different pointer
252748de17
2021-12-24 02:28:56 +09:00
Kenta Murata
75f552e973
[ruby/bigdecimal] Fix the precision of the adjusted quotient
8dc8cd339d
2021-12-24 02:28:56 +09:00
Kenta Murata
7b2cfce543
[ruby/bigdecimal] Let BigDecimal_DoDivmod use the same precision calculation as BigDecimal_divide
11cb2c8840
2021-12-24 02:28:55 +09:00
Kenta Murata
e1265c8198
[ruby/bigdecimal] Use larger precision in divide for irrational or recurring results
Just in case for irrational or recurring results, the precision of the
quotient is set to at least more than 2*Float::DIG plus alpha.

[Bug #13754] [Fix GH-94]

99442c75d3
2021-12-24 02:28:55 +09:00
Kenta Murata
8ee8ac6423
[ruby/bigdecimal] Fix trailing zeros handling in rb_uint64_convert_to_BigDecimal
Fix GH-192

eebc98b85a
2021-12-24 02:28:55 +09:00
BurdetteLamar
ed7f4c24d7
[ruby/bigdecimal] Respond to review
f528a0006e
2021-12-24 02:28:54 +09:00
BurdetteLamar
ed8ec5dcb3
[ruby/bigdecimal] Respond to review
4eadcdf0a6
2021-12-24 02:28:54 +09:00
BurdetteLamar
44acab76af
[ruby/bigdecimal] Respond to review
6d69422e37
2021-12-24 02:28:53 +09:00
BurdetteLamar
973e508472
[ruby/bigdecimal] Respond to review for #precision
681cd2d81d
2021-12-24 02:28:53 +09:00
BurdetteLamar
5888d3030d
[ruby/bigdecimal] Enhanced RDoc for bigdecimal.c
3a35f92f8b
2021-12-24 02:28:53 +09:00
BurdetteLamar
01b2ccaa95
[ruby/bigdecimal] Enhanced RDoc for bigdecimal.c
31a7a37426
2021-12-24 02:28:52 +09:00
Jean Boussier
ec478d947f
[ruby/bigdecimal] Fix negative Bignum conversion
Introduced in 4792a917d8

`rb_absint_size` return the number of bytes needed to fit
the absolute integer, but negative integers need the sign, so one more
bit, and potentially one more byte.

0f3d5d0eb7
2021-12-24 02:28:51 +09:00
Olle Jonsson
03507498b6
[ruby/bigdecimal] VpCheckException: improve grammar
I added a space before the parenthesis, too.

159af10b17
2021-12-24 02:28:47 +09:00
Nobuyoshi Nakada
1dfe75b0be
Fixed 'maybe_unused' attribute
```
../../../src/ext/bigdecimal/bigdecimal.c:303:5: error: 'maybe_unused' attribute cannot be applied to types
    ENTER(1);
    ^
```
2021-07-06 01:13:54 +09:00
Kenta Murata
4e2e1d6093
[ruby/bigdecimal] Fix uint64 conversion
Stop using logarithm to compute the number of components.
Instead, use the theoretical maximum number of components for buffer,
and count up the actual number of components during conversion.

9067b353ac
2021-02-04 13:18:58 +09:00
Kenta Murata
868d66e0b5
[ruby/bigdecimal] Stop using rmpd and RMPD prefixes and DBLE_FIG
7479923fdb
2021-02-04 13:18:52 +09:00
Kenta Murata
8df1881c8f [ruby/bigdecimal] Fix the maximum length of float number
This change is for preventing the false-positive alert by CoverityScan.
See CID-1471770 for the detail.

4d5b97125b
2021-02-03 18:25:03 +09:00
Kenta Murata
a1bb110b56 [ruby/bigdecimal] [Doc] Fix the comment of BigDecimal_div2 [ci skip]
a109d0984f
2021-01-22 14:07:32 +09:00
Kenta Murata
887a1bfbbc [ruby/bigdecimal] Stop using GetVpValue in rb_big_convert_to_BigDecimal
034fd2b25e
2021-01-22 13:59:04 +09:00
Kenta Murata
b130644584 [ruby/bigdecimal] Fix for the coerce cases in divide and DoDivmod
1cb92487f7
2021-01-16 00:09:26 +09:00
Kenta Murata
9d0c5e2754 [ruby/bigdecimal] Use pre-allocated special values in BigDecimal_DoDivmod
d2746121cf
2021-01-16 00:08:09 +09:00
Kenta Murata
f95f85b215 [ruby/bigdecimal] Use new conversion functions in BigDecimal_DoDivmod
68c20200d5
2021-01-16 00:07:48 +09:00
Kenta Murata
0a039c5fbb [ruby/bigdecimal] Use new conversion functions in BigDecimal_divide
3b55ad1c42
2021-01-15 06:42:48 +09:00
Kenta Murata
500fc63cd0 [ruby/bigdecimal] Reorder the arguments of BigDecimal_divide
1e03da7076
2021-01-15 06:42:38 +09:00
Kenta Murata
4d13f3e9da [ruby/bigdecimal] Explicitly cast size_t to int
b1f1ed26c9
2021-01-14 10:21:10 +09:00
Kenta Murata
b4ade73974
[ruby/bigdecimal] Explicitly cast uint64_t to double
f0d94e6843
2021-01-14 10:20:47 +09:00
Kenta Murata
a5b4b806de
[ruby/bigdecimal] Allow digits=0 in BigDecimal(flt) and Float#to_d
Using dtoa of mode=0, we can determine the number of digits in decimal that is
necessary to represent the given Float number without errors.

This change permits digits=0 in BigDecimal(flt) and Float#to_d, and these
methods use dtoa of mode=0 when the given digits is 0.

Internal implicit conversion from Float also uses digits=0.

[Fix GH-70]

2dbe170e35
2021-01-13 11:49:18 +09:00
Kenta Murata
4ba3a4491e
[ruby/bigdecimal] Optimize rb_float_convert_to_BigDecimal by using dtoa
This improve the conversion speed several times faster than before.

```
RUBYLIB= BUNDLER_ORIG_RUBYLIB= /home/mrkn/.rbenv/versions/3.0.0/bin/ruby -v -S benchmark-driver /home/mrkn/src/github.com/ruby/bigdecimal/benchmark/from_float.yml
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]
Calculating -------------------------------------
                     bigdecimal 3.0.0      master
              flt_e0         156.400k    783.356k i/s -    100.000k times in 0.639388s 0.127656s
            flt_ep10         158.640k    777.978k i/s -    100.000k times in 0.630359s 0.128538s
           flt_ep100         101.676k    504.259k i/s -    100.000k times in 0.983512s 0.198311s
            flt_em10         103.439k    726.339k i/s -    100.000k times in 0.966751s 0.137677s
           flt_em100          79.675k    651.446k i/s -    100.000k times in 1.255095s 0.153505s

Comparison:
                           flt_e0
              master:    783355.6 i/s
    bigdecimal 3.0.0:    156399.5 i/s - 5.01x  slower

                         flt_ep10
              master:    777977.6 i/s
    bigdecimal 3.0.0:    158639.7 i/s - 4.90x  slower

                        flt_ep100
              master:    504259.4 i/s
    bigdecimal 3.0.0:    101676.5 i/s - 4.96x  slower

                         flt_em10
              master:    726338.6 i/s
    bigdecimal 3.0.0:    103439.2 i/s - 7.02x  slower

                        flt_em100
              master:    651446.3 i/s
    bigdecimal 3.0.0:     79675.3 i/s - 8.18x  slower

```

5bdaedd530
9bfff57f90
d071a0abbb
2021-01-13 02:11:18 +09:00
Kenta Murata
2175c2c957 [ruby/bigdecimal] Use pre-allocated objects for special values
95c201f2d3
2021-01-13 01:58:23 +09:00
Kenta Murata
6670de82c2
[ruby/bigdecimal] Fix exception message raised in Kernel.BigDecimal
d163f170a4
ff8eeeb064
2021-01-13 01:27:04 +09:00
Kenta Murata
ccabf4966f [ruby/bigdecimal] Fix length calculation in rb_uint64_convert_to_BigDecimal
14e53ed7f6
2021-01-12 17:38:43 +09:00
Kenta Murata
1d04faee23 [ruby/bigdecimal] Use rb_cstr_convert_to_BigDecimal in GetVpValueWithPrec
381ddf5ff6
2021-01-12 09:22:14 +09:00
Kenta Murata
78d3813c74 [ruby/bigdecimal] Add rb_cstr_convert_to_BigDecimal
ac230a996e
2021-01-12 09:21:58 +09:00
Kenta Murata
2e9b6096a6 [ruby/bigdecimal] Fix type name
2dad4d17b2
2021-01-10 08:40:05 +09:00
Kenta Murata
8b53cbaf5e
[ruby/bigdecimal] Avoid casting negative value to size_t
https://github.com/ruby/bigdecimal/f047b2786f
2021-01-10 08:36:29 +09:00