Si bien jugando con un ejemplo de recursión de cola he notado una pequeña discrepancia entre los resultados de una llamada recursiva normal, y una cola llamada recursiva:¿Por qué hay una diferencia de redondeo entre mi recursión normal y el ejemplo de recursión de cola?
scala> def fact(n: Int): Double = if(n < 1) 1 else n * fact(n - 1)
fact: (n: Int)Double
scala> fact(30)
res31: Double = 2.6525285981219103E32
scala> @tailrec def fact(n: Int, acc: Double = 1): Double = if(n < 1) acc else fact(n - 1, n * acc)
fact: (n: Int, acc: Double)Double
scala> fact(30)
res32: Double = 2.652528598121911E32
Sólo por curiosidad, por favor alguien puede explicarme por qué o cuando el el redondeo está sucediendo. Mi suposición es que debido a que el compilador de Scala traduce la versión recursiva de la cola a un bucle, el parámetro acc
se asigna en cada iteración del bucle, y que el pequeño error de redondeo se desliza allí.
En un lenguaje de programación apropiado, como Scala, la asignación de un resultado 'Doble' a una variable' Doble' no introduce un error de redondeo. –