juegos - LUA(Corona SDK) math.floor() devuelve valor incorrecto con incremento de 0.1
corona sdk juegos (2)
Los números flotantes son diabólicos. No los use como contadores de bucle.
for i = 30, 70 do
local i = i / 10
print("val : "..i.." floor : "..math.floor(i))
end
Tengo un error extraño cuando uso la función Math.floor en valores dobles incrementados de 0.1 cada vez.
Sucede solo con un incremento de 0.1 y comienza en el valor 5
Ejemplo: math.floor (4) return 4 pero math.floor (5) return 4 !!!
Puedes probarlo tú mismo, con esta simple pieza de código:
for i=3,7,0.1 do
print("val : "..i.." floor : "..math.floor(i))
end
Aquí está el resultado del código anterior:
Corona Simulator[1494:707] val : 3 floor : 3
Corona Simulator[1494:707] val : 3.1 floor : 3
Corona Simulator[1494:707] val : 3.2 floor : 3
Corona Simulator[1494:707] val : 3.3 floor : 3
Corona Simulator[1494:707] val : 3.4 floor : 3
Corona Simulator[1494:707] val : 3.5 floor : 3
Corona Simulator[1494:707] val : 3.6 floor : 3
Corona Simulator[1494:707] val : 3.7 floor : 3
Corona Simulator[1494:707] val : 3.8 floor : 3
Corona Simulator[1494:707] val : 3.9 floor : 3
Corona Simulator[1494:707] val : 4 floor : 4
Corona Simulator[1494:707] val : 4.1 floor : 4
Corona Simulator[1494:707] val : 4.2 floor : 4
Corona Simulator[1494:707] val : 4.3 floor : 4
Corona Simulator[1494:707] val : 4.4 floor : 4
Corona Simulator[1494:707] val : 4.5 floor : 4
Corona Simulator[1494:707] val : 4.6 floor : 4
Corona Simulator[1494:707] val : 4.7 floor : 4
Corona Simulator[1494:707] val : 4.8 floor : 4
Corona Simulator[1494:707] val : 4.9 floor : 4
Corona Simulator[1494:707] val : 5 floor : 4
Corona Simulator[1494:707] val : 5.1 floor : 5
Corona Simulator[1494:707] val : 5.2 floor : 5
Corona Simulator[1494:707] val : 5.3 floor : 5
Corona Simulator[1494:707] val : 5.4 floor : 5
Corona Simulator[1494:707] val : 5.5 floor : 5
Corona Simulator[1494:707] val : 5.6 floor : 5
Corona Simulator[1494:707] val : 5.7 floor : 5
Corona Simulator[1494:707] val : 5.8 floor : 5
Corona Simulator[1494:707] val : 5.9 floor : 5
Corona Simulator[1494:707] val : 6 floor : 5
Corona Simulator[1494:707] val : 6.1 floor : 6
Corona Simulator[1494:707] val : 6.2 floor : 6
Corona Simulator[1494:707] val : 6.3 floor : 6
Corona Simulator[1494:707] val : 6.4 floor : 6
Corona Simulator[1494:707] val : 6.5 floor : 6
Corona Simulator[1494:707] val : 6.6 floor : 6
Corona Simulator[1494:707] val : 6.7 floor : 6
Corona Simulator[1494:707] val : 6.8 floor : 6
Corona Simulator[1494:707] val : 6.9 floor : 6
Corona Simulator[1494:707] val : 7 floor : 6
Si puede ayudar, si aplicamos un módulo 1 en el resultado de un valor erróneo, obtenemos esto como resultado: 0.99999999999999
de hecho, es un problema de flotación común,
Aquí está la respuesta oficial que recibí del soporte de corona:
Hola,
Lo que está viendo es un problema general con los números de coma flotante. Todos los números en Lua son números flotantes y, como tales, están sujetos a errores de redondeo. Agregar 0.1 a otro número de coma flotante no es exactamente 0.1 y el error acumulativo cuando se usa una y otra vez. Cuando piense que el número es 5.0, puede ser 4.99999999999999999, entonces floor devuelve 4. La sentencia de impresión puede estar redondeando antes de imprimir.
La biblioteca matemática es el código Lua estándar (v5.1) y no se ha modificado para Corona.
Puede googlear el sujeto o los problemas de redondeo de punto flotante, pero, en general, debe tener cuidado al usar matemática de coma flotante.
Saludos, Tom
- Corona Labs - Soporte [email protected]