BigDecimal bug?

M

Mark Somerville

Hello,

Can anyone tell me if this is a bug? It certainly seems like it to me.
=> "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
 
M

Mark Somerville

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
 
S

Stefano Crocco

Alle marted=EC 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 m=
e?

alias_method works for instance methods (i.e, a method of instances of clas=
s=20
BigDecimal). You're aliasing a class method (new), that is an instance meth=
od=20
of the class BigDecimal. To do so, you should enter a scope where self is n=
ot=20
the class BigDecimal, but BigDecimal's class. This way, new is seen as an=20
instance method (i.e. a method of instances of the class of BigDecimal, i.e=
=2E=20
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 t=
o=20
clarify)

Stefano
 
D

Daniel Berger

Hello,

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

=> "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
 
M

Mark Somerville

Alle martedì 13 marzo 2007, Mark Somerville ha scritto:

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)

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

Mark
 
M

Mark Somerville

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.

Sure, done.

Mark
 
S

Shigeo Kobayashi

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 <[email protected]>

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

Thank you in advance.

Shigeo Kobayashi
(e-mail address removed)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top