Issue #7404 has been updated by mame (Yusuke Endoh).

Status changed from Open to Assigned
Assignee set to mrkn (Kenta Murata)
Target version set to 2.0.0


----------------------------------------
Bug #7404: BigDecimal#add(Float) ??®ã?? BigDecimal ???è¿???????ä»???®å?????æ¼?ç®???§ã?¯ä??å¤???«ã?ªã??
https://bugs.ruby-lang.org/issues/7404#change-33806

Author: sho-h (Sho Hashimoto)
Status: Assigned
Priority: Normal
Assignee: mrkn (Kenta Murata)
Category: 
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-19 trunk 37734) [x86_64-linux]


=begin
????????¾ã?®å¯¾å¿?中ã?«æ??ä»?????????®ã?§ã????????#7176 ??®å¯¾å¿???«ã????????BigDecimal#+ ??? Float ???渡ã???????´å?????BigDecimal ???è¿???£ã?¦ã??????¿ã???????ªã?®ã?§ã????????ä»???®å?????æ¼?ç®???¯ã?????以å????¨å??æ§???? Float ???è¿????????????§ã?????

ä¾??????°ã??BigDecimal#-???#sub ???ä¾???«ã????¾ã????¨ã??以ä????®ã???????«å??ä½??????¾ã?????(#+ ??? #add ?????¨ã????¹ã?? BigDecimal ???è¿??????¾ã??)

  require "bigdecimal"
  a = BigDecimal.new("1.1")
  b = BigDecimal.new("2.2")
  c = 3.3

  p a - b # => #<BigDecimal:f9232478,'-0.11E1',18(36)>
  p a - c # => -2.1999999999999997
  p a.sub(b, 10) # => #<BigDecimal:f923239c,'-0.11E1',18(36)>
  p a.sub(c, 0)  # => -2.1999999999999997
  p a.sub(c, 10) # => ArgumentError

BigDecimal#sub ??®å??è£???§ã????????BigDecimal_sub2 ??¢æ?°ã?®ä»¥ä¸???®é?¨å??????????£ã?¦ã???????¨æ???????®ã?§ã????????c ??? Float ???代å?¥ã?????????????????GetVpValue ??®æ????«ä??å¤???«ã?ªã????®ã?§ã?¯ã?ªã???????¨è???????¦ã????¾ã?????(ç¬? 2 å¼???°ã?? 0 ??????å®?????????´å????? mx == 0 ??®æ?¹ã?????????????????çµ??????? Float ??«ã?ªã??????????§ã??)

    if (mx == 0) return BigDecimal_sub(self, b);
    else {
       size_t pl = VpSetPrecLimit(0);
       VALUE   c = BigDecimal_sub(self,b); /* ????????§ã?? Float ??ªã????¸ã?§ã?¯ã?????è¿???£ã?¦ã????? */
       VpSetPrecLimit(pl);
       GUARD_OBJ(cv,GetVpValue(c,1));      /* ????????? GetVpValueWithPrec ??? prec å¼???°ã?? -1 ???渡ã????????ä¾?å¤? */
       VpLeftRound(cv,VpGetRoundMode(),mx);
       return ToValue(cv);
    }

BigDecimal#add ??¨å?????????????«ã??Rational ??? Float ???渡ã??????????´å????¯ã??è¨?ç®?çµ??????? BigDecimal ??«ã?ªã??????????«ã???????®ã??????????®ã?§ã?¯ã?ªã???????¨æ???????¾ã????????
=end



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