[#56333] [CommonRuby - Feature #8723][Open] Array.any? predicate returns true for empty array. — "nurettin (Nurettin Onur TUGCU)" <onurtugcu@...>

12 messages 2013/08/02

[#56368] [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException — "takiuchi (Genki Takiuchi)" <genki@...21g.com>

15 messages 2013/08/04

[#56407] [ruby-trunk - misc #8741][Open] email notification on bugs.ruby-lang.org is broken — "rits (First Last)" <redmine@...>

18 messages 2013/08/05

[#56524] [ruby-trunk - Bug #8770][Open] [PATCH] process.c: avoid EINTR from Process.spawn — "normalperson (Eric Wong)" <normalperson@...>

19 messages 2013/08/10

[#56536] [ruby-trunk - Feature #8772][Open] Hash alias #| merge, and the case for Hash and Array polymorphism — "trans (Thomas Sawyer)" <redmine@...>

24 messages 2013/08/11

[#56544] [ruby-trunk - Bug #8774][Open] rb_file_dirname return wrong encoding string when dir is "." — jiayp@... (贾 延平) <jiayp@...>

10 messages 2013/08/11

[#56569] [ruby-trunk - Feature #8781][Open] Use require_relative() instead of require() if possible — "ko1 (Koichi Sasada)" <redmine@...>

31 messages 2013/08/12
[#56582] [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — "drbrain (Eric Hodel)" <drbrain@...7.net> 2013/08/12

[#56584] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — SASADA Koichi <ko1@...> 2013/08/12

(2013/08/13 2:25), drbrain (Eric Hodel) wrote:

[#56636] Re: [ruby-trunk - Feature #8781] Use require_relative() instead of require() if possible — Aaron Patterson <tenderlove@...> 2013/08/16

On Tue, Aug 13, 2013 at 07:38:01AM +0900, SASADA Koichi wrote:

[#56634] [ruby-trunk - Feature #8788][Open] use eventfd on newer Linux instead of pipe for timer thread — "normalperson (Eric Wong)" <normalperson@...>

11 messages 2013/08/16

[#56648] [ruby-trunk - Bug #8795][Open] "Null byte in string error" on Marshal.load — "mml (McClain Looney)" <m@...>

17 messages 2013/08/16

[#56824] [ruby-trunk - Feature #8823][Open] Run trap handler in an independent thread called "Signal thread" — "ko1 (Koichi Sasada)" <redmine@...>

14 messages 2013/08/27

[#56878] [ruby-trunk - misc #8835][Open] Introducing a semantic versioning scheme and branching policy — "knu (Akinori MUSHA)" <knu@...>

11 messages 2013/08/30

[#56890] [ruby-trunk - Feature #8839][Open] Class and module should return the class or module that was opened — "headius (Charles Nutter)" <headius@...>

26 messages 2013/08/30

[#56894] [ruby-trunk - Feature #8840][Open] Yielder#state — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

14 messages 2013/08/30

[ruby-core:56835] [ruby-trunk - Bug #8826][Open] BigDecimal#div and #quo different behavior and inconsistencies

From: karatedog (Földes László) <foldes.laszlo2@...>
Date: 2013-08-27 18:43:33 UTC
List: ruby-core #56835
Issue #8826 has been reported by karatedog (F旦ldes L叩szl坦).

----------------------------------------
Bug #8826: BigDecimal#div and #quo different behavior and inconsistencies
https://bugs.ruby-lang.org/issues/8826

Author: karatedog (F旦ldes L叩szl坦)
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0p247 (2013-06-27 revision 41674) [i686-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


BigDecimal's #div and #quo method behave differently despite the #div documentation says: "See BigDecimal#quo"

#div returns Fixnum if there is no precision argument for #div (this parameter is not documented):

2.0.0-p247 :018 > BigDecimal(5).div(5).class
 => Fixnum 
2.0.0-p247 :031 > BigDecimal(5).div(5.1).class
 => Fixnum

#div returns Fixnum even for a Float argument:
2.0.0-p247 :118 > BigDecimal(5).div(5.01)
 => 0 

It returns Fixnum even if every argument is BigDecimal:
2.0.0-p247 :043 > BigDecimal(5).div(BigDecimal(5.1,5)).class
 => Fixnum

When provided the precision argument, #div returns BigDecimal:
2.0.0-p247 :036 > BigDecimal(5).div(5,8).class
 => BigDecimal 
2.0.0-p247 :131 > BigDecimal(5).div(BigDecimal(5.1,5),8).class
 => BigDecimal 

But first argument cannot be Float along with precision:
2.0.0-p247 :032 > BigDecimal(5).div(5.1,8).class
ArgumentError: Float can't be coerced into BigDecimal without a precision
	from (irb):32:in `div'
	from (irb):32
	from /home/karatedog/.rvm/rubies/ruby-2.0.0-p247/bin/irb:13:in `<main>'

Whereas #quo does not accept a precision argument and returns BigDecimal (hence no configurable precision here, although the documentation says that #quo applies round operation):
2.0.0-p247 :121 > BigDecimal(5).quo(5.01)
 => #<BigDecimal:8bacf68,'0.9980039920 1596806387 225549E0',27(45)> 

Circumventing the precision with class method does not work on #quo, it's like the limit is maxed:
2.0.0-p247 :135 > BigDecimal::limit(5)
 => 5 
2.0.0-p247 :136 > BigDecimal(1).quo(3)
 => #<BigDecimal:899c778,'0.33333E0',9(36)> 
2.0.0-p247 :080 > BigDecimal::limit(50)
 => 5 
2.0.0-p247 :081 > BigDecimal(1).quo(3)
 => #<BigDecimal:8a92d94,'0.3333333333 33333333E0',18(36)> 

Precision does not seem to be automatic:
2.0.0-p247 :141 > BigDecimal::limit(500)
 => 100 
2.0.0-p247 :142 > BigDecimal(1).quo(229)
 => #<BigDecimal:8be67f4,'0.4366812227 074236E-2',18(36)> 
229 is a full period prime, its reciprocal yields 228 fractional digits before repetition. 

Whereas #div's precision can be larger than #div's:
2.0.0-p247 :109 > BigDecimal(1).div(3,19)
 => #<BigDecimal:8acb2d4,'0.3333333333 333333333E0',27(54)>

And for 229:
2.0.0-p247 :144 > BigDecimal(1).div(229,250)
 => #<BigDecimal:8bc8b28,'0.4366812227 0742358078 6026200873 3624454148 4716157205 2401746724 8908296943 2314410480 3493449781 6593886462 8820960698 6899563318 7772925764 1921397379 9126637554 5851528384 2794759825 3275109170 3056768558 9519650655 0218340611 3537117903 9301310043 6681222707...

Expected behavior:
- One division method to rule them all :-) (#Division)
- Never truncate a result (aka no Fixnum/Bignum as result). If someone uses BigDecimal, they probably wanted large precision instead of truncating the results by default.
- #Division should accept Float, Rational, String, Complex, Integer, BigDecimal as divisor, even Float w/o precision. (This is intended as a full list of acceptable classes, #div and #quo can already take different classes as arguments). 
- #Division should accept a precision argument which would override ::Limit (as this happens in many instance method), this argument is optional. Without precision argument, use ::Limit

as for now proper calculation only happens if:
- method is #div
- the divisor is converted to BigDecimal
- a precision argument is given to #div



-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next