Convertir flotante a binario

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Quiero pasar valores punto de coma flotante a bytes para escribirlos en un archivo binario en formato de 32 bits little endian, pero algo falla en mi función. para facilitar el debug agregue un debug dialog, el resultante esperado debería ser: 85 EB 91 3F, en su lugar estoy obteniendo: 05 EB 01 48, y no entiendo por qué, no sé si es un problema de lua 5.1 o algo falla en la función, quizás estoy calculando mal el exponente, no estoy seguro, alguien ha tenido que tratar con algo similar antes?

Aquí la función:
function FloatToBytes(x)
	Debug.ShowWindow(true);
	
	local sign = 0;
	if(x < 0)then
		sign = 1;
		x = - x;
	end

	local mantissa, exponent = math.frexp(x);	exponent = exponent + 126;

	local byte1 = math.floor(mantissa * 128) % 256;	mantissa = (mantissa - byte1 / 128) * 256;
	local byte2 = math.floor(mantissa) % 256;	mantissa = (mantissa - byte2) * 256;
	local byte3 = math.floor(mantissa) % 256;	mantissa = (mantissa - byte3) * 256;
	local byte4 = math.floor(mantissa) + exponent * 128 + sign * 128;	byte4 = byte4 % 256;
	
	Debug.Print("\r\n"..string.format("%02X ", byte4)..string.format("%02X ", byte3)..string.format("%02X ", byte2)..string.format("%02X ", byte1));
	
	return string.char(byte4, byte3, byte2, byte1);
end

FloatToBytes(1.14);
Estoy intentando replicar algo que en c++ parece ser relativamente 'sencillo'

Código: Seleccionar todo

Write(/*1.14*/, sizeof(float))
De momento no encuentro una solución usando matemáticas. Logre resolver usando luajit y ffi, pero me gustaría hacerlo con la lib de lua 5.1 que viene con ams 8.5, para evitar problemas de compatibilidad con algún otro plugin que uso en mi proyecto...
you can handle the implementation with memoryex