Possible bug?

Hi,

I have a piece of code which I think should be working, but it doesn't.

def standard_dev(a, mean)
   Math.sqrt((a.inject(0.0){|v,r| r += (v-mean)*(v-mean) })/a.length)
end

computes results that don't make sense and differ from the values computed by this code:

def standard_dev(a, mean)
   r = 0.0
   a.each{|v| r += (v-mean)*(v-mean) }
   Math.sqrt(r/a.length)
end

I think the two should be different. Am I missing something?

-- stefan

Stefan Kaes wrote:

Hi,

I have a piece of code which I think should be working, but it doesn't.

def standard_dev(a, mean)
  Math.sqrt((a.inject(0.0){|v,r| r += (v-mean)*(v-mean) })/a.length)
end

computes results that don't make sense and differ from the values computed by this code:

def standard_dev(a, mean)
  r = 0.0
  a.each{|v| r += (v-mean)*(v-mean) }
  Math.sqrt(r/a.length)
end

Oops. This should have been:

···

I think the two should be *identical*. Am I missing something?

Stefan Kaes a écrit :

Hi,

I have a piece of code which I think should be working, but it doesn't.

def standard_dev(a, mean)
  Math.sqrt((a.inject(0.0){|v,r| r += (v-mean)*(v-mean) })/a.length)
end

Well, try this :
def standard_dev(a, mean)
  Math.sqrt((a.inject(0.0){|r,v| r += (v-mean)*(v-mean) })/a.length)
end

....

The doc says:

enum.inject {| memo, obj | block } => obj

You just swapped the two arguments ...

Pierre

···

computes results that don't make sense and differ from the values
computed by this code:

def standard_dev(a, mean)
  r = 0.0
  a.each{|v| r += (v-mean)*(v-mean) }
  Math.sqrt(r/a.length)
end

I think the two should be different. Am I missing something?

-- stefan

Pierre Barbier de Reuille wrote:

The doc says:

enum.inject {| memo, obj | block } => obj

You just swapped the two arguments ...

Pierre

Dang. I copied this from code for computing the average, which is insensitive to block argument order. Thanks.