¿bug de divmod?

Buenas,

me he encontrado con un ¿bug? del método divmod:

$ irb

1.divmod(0.5)
=> [2, 0.0]
1.divmod(0.2)
=> [4, 0.2]

está claro que en el segundo caso el resultado debería ser [5, 0.0].

He buscado en rubyforge y el único bug que parece relacionado es:

http://rubyforge.org/tracker/?group_id=426&atid=1698&func=detail&aid=14540

pero si ejecuto el script para probar si dicho bug te afecta, resulta
que en máquina la salida del script es correcta.

Mi ruby es ruby 1.8.5 (2006-08-25) [i486-linux] y estoy en Ubuntu 7.04.

Me parece algo tan gordo que dudo que nadie antes se haya dado cuenta.

¿Estoy haciendo algo mal? ¿Os ha pasado a vosotros?

Salu2,

On Dec 17, 2007, at 11:33 AM, Javier Vidal P. wrote:

$ irb

1.divmod(0.5)
=> [2, 0.0]

1.divmod(0.2)
=> [4, 0.2]

está claro que en el segundo caso el resultado debería ser [5, 0.0].

No he mirado los detalles, pero apuesto a que tiene que ver con que
0.2 se representa como un numero mas grande en realidad:

 irb(main):020:0> sprintf("%.30f", 0.2)
 => "0.200000000000000011102230246252"

y al hecho de que hay un floor hacia menos infinito.

Si correcto de hecho no seria un bug.

– fxn

Ummm, pues tiene toda la pinta. Hay que tener cuidado con los floats.

Lo he resuelto utilizando big decimals:

$ irb

5 % 0.2
=> 0.2
require ‘bigdecimal’
=> true
divisor = BigDecimal(“0.2”)
=> #BigDecimal:b7a2fb7c,‘0.2E0’,4(8)
resto = 5 % divisor
=> #BigDecimal:b7a2d5d4,‘0.0’,4(12)
resto.to_i
=> 0

Muchas gracias, Xavier.

2007/12/17, Xavier N. [email protected]: