Forum: Ruby BigDecimal bug?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
286bdbaf4c6dce87b96ea555fc43327e?d=identicon&s=25 Mark Somerville (Guest)
on 2007-03-13 12:08
(Received via mailing list)
Hello,

Can anyone tell me if this is a bug? It certainly seems like it to me.

>> BigDecimal.new("-.31").to_s
=> "0.31"

$ ruby -v
ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]

I have tried altering the BigDecimal initialisation code, without
success.
Does anyone have any clues as to how to workaround this issue without
pre-processing the "-.31" string? I'd think I could alter the "new" call
to
alter the malformed string a little.

Thanks a lot in advance,

Mark
286bdbaf4c6dce87b96ea555fc43327e?d=identicon&s=25 Mark Somerville (Guest)
on 2007-03-13 12:45
(Received via mailing list)
On Tue, Mar 13, 2007 at 08:08:07PM +0900, Mark Somerville wrote:
> I have tried altering the BigDecimal initialisation code, without success.
> Does anyone have any clues as to how to workaround this issue without
> pre-processing the "-.31" string? I'd think I could alter the "new" call to
> alter the malformed string a little.

I've managed to get a workaround going now (I realise this is a poor
substitute for fixing the poorly formed decimals), but I don't
understand why I need
to wrap the alias_method inside class << self. Can anyone explain it to
me?

class BigDecimal

  #why do I need to wrap this in class << self ???
  class << self
    alias_method 'original_new', 'new'
  end

  def self.new(value)
    value = "-0.#{$1}" if value =~ /^-\.(.+)$/
    return original_new(value)
  end

end

Cheers,

Mark
C40020a47c6b625af6422b5b1302abaf?d=identicon&s=25 Stefano Crocco (crocco)
on 2007-03-13 12:51
(Received via mailing list)
Alle martedì 13 marzo 2007, Mark Somerville ha scritto:
> I don't understand why I need
> to wrap the alias_method inside class << self. Can anyone explain it to me?

alias_method works for instance methods (i.e, a method of instances of
class
BigDecimal). You're aliasing a class method (new), that is an instance
method
of the class BigDecimal. To do so, you should enter a scope where self
is not
the class BigDecimal, but BigDecimal's class. This way, new is seen as
an
instance method (i.e. a method of instances of the class of BigDecimal,
i.e.
of BigDecimal). This is what you do with the class << self construct.

I hope this explaination makes sense (if it doesn't, tell me and I'll
try to
clarify)

Stefano
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (Guest)
on 2007-03-13 17:31
(Received via mailing list)
On Mar 13, 5:08 am, Mark Somerville <m...@pccl.info> wrote:
> Hello,
>
> Can anyone tell me if this is a bug? It certainly seems like it to me.
>
> >> BigDecimal.new("-.31").to_s
>
> => "0.31"
>
> $ ruby -v
> ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]

Looks like a bug to me. I think it's in the VpToString() function
being called by the BigDecimal_to_s() function. I'm not positive,
though, as the code is long and ugly.

Please submit a bug report to ruby-core.

Thanks,

Dan
286bdbaf4c6dce87b96ea555fc43327e?d=identicon&s=25 Mark Somerville (Guest)
on 2007-03-13 18:25
(Received via mailing list)
On Tue, Mar 13, 2007 at 08:51:02PM +0900, Stefano Crocco wrote:
>
> I hope this explaination makes sense (if it doesn't, tell me and I'll try to
> clarify)

Thanks a lot Stefano, that explanation was exactly what I needed.

Mark
286bdbaf4c6dce87b96ea555fc43327e?d=identicon&s=25 Mark Somerville (Guest)
on 2007-03-13 18:35
(Received via mailing list)
On Wed, Mar 14, 2007 at 01:31:32AM +0900, Daniel Berger wrote:
> > ruby 1.8.5 (2006-12-04 patchlevel 2) [x86_64-linux]
>
> Looks like a bug to me. I think it's in the VpToString() function
> being called by the BigDecimal_to_s() function. I'm not positive,
> though, as the code is long and ugly.
>
> Please submit a bug report to ruby-core.

Sure, done.

Mark
6a2311a724bd6275df7560848ae8921d?d=identicon&s=25 Shigeo Kobayashi (Guest)
on 2007-03-14 04:34
(Received via mailing list)
Subject: Re: BigDecimal bug?


> Can anyone tell me if this is a bug? It certainly seems like it to me.
> BigDecimal.new("-.31").to_s
> => "0.31"
Yes,could you apply the patch bellow:
---------------------------------------------------------------------------------
$ ruby/ruby-1.8.6/ext/bigdecimal
$ diff -up bigdecimal.c.old bigdecimal.c
--- bigdecimal.c.old    2007-03-14 10:21:30.015625000 +0900
+++ bigdecimal.c        2007-03-14 12:26:18.625000000 +0900
@@ -3921,7 +3921,7 @@ VpCtoV(Real *a, const char *int_chr, U_L
     /* get integer part */
     i = 0;
     sign = 1;
-    if(ni > 0) {
+    if(ni >= 0) {
         if(int_chr[0] == '-') {
             sign = -1;
             ++i;
---------------------------------------------------------------------------------

Matz, could you please apply the patch and commit the source
with the change log ?
Somewhat like:
Wed Mar 14 12:30:00 2007  Shigeo Kobayashi  <shigeo@tinyforest.jp>

 * ext/bigdecimal/bigdecimal.c: BigDecimal("-.31") is now
   treated as ("-0.31") not as ("0.31").

Thank you in advance.

Shigeo Kobayashi
shigeo@tinyforest.jp
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2007-03-14 07:26
(Received via mailing list)
Hi,

In message "Re: BigDecimal bug?"
    on Wed, 14 Mar 2007 12:34:08 +0900, "Shigeo Kobayashi"
<shigeo@tinyforest.gr.jp> writes:

|Matz, could you please apply the patch and commit the source
|with the change log ?
|Somewhat like:
|Wed Mar 14 12:30:00 2007  Shigeo Kobayashi  <shigeo@tinyforest.jp>
|
| * ext/bigdecimal/bigdecimal.c: BigDecimal("-.31") is now
|   treated as ("-0.31") not as ("0.31").

Done.

              matz.
This topic is locked and can not be replied to.