Página 1 de 1

¿Como saltar el limite de 15 Digitos? (Espec. 754 del IEEE)

Publicado: 15 Oct 2014 11:22
por anchobeta
Estube en la busqueda de convertir de Hexadecimal (Radix 16) a decimal (Radix 10) y encontré esto en el foro viewtopic.php?f=3&t=2272, que es justo lo que estaba buscando, pero lamentablemente este codigo que puso pabloko no funciona o talvez si pero no sé xD

decimal=tonumber("01473AD2A1F8EA868721D26A1E4846", 16)..""

(da como resultado "4294967295") , pero esta mal! ya que al utilizar el programa "Haxial Calculator" (https://mega.co.nz/#!NoczQDBL!ezZYDK1k4 ... DjBUxPrWAU), me da este resultado: "6637008361484516120249736644937798"

Imagen

Asi que pensé en crear una función basandome en lo que indican en la web que pabloko paso en el hilo ya mencionado https://sooeet.com/math/base-converter.php, para luego darme cuenta que en foro del mismo "Indigo Rose" ya habia alguien que habia desarrollado dicha funcion, y es esta;

function Hex2Dec(sValue)
bFigErr = false;
if type(sValue) == "number" then
sValue = sValue.."";
end
sValue = String.TrimLeft(sValue, "0");
nDigits = String.Length(sValue);
nTotal = 0;
-- 414 = 4*16^2 + 1*16^1 + 4*16^0 power = base^exp
while nDigits > 0 do
sIn = String.Upper(String.Left(sValue, 1));
if sIn > "9" then
if sIn == "A" then
nFactor = 10;
elseif sIn == "B" then
nFactor = 11;
elseif sIn == "C" then
nFactor = 12;
elseif sIn == "D" then
nFactor = 13;
elseif sIn == "E" then
nFactor = 14;
elseif sIn == "F" then
nFactor = 15;
else
-- error
bFigErr = true;
sTotal = "";
break;
end
else
nFactor = String.ToNumber(sIn);
end
-- go
nTotal = nTotal + nFactor * Math.Pow(16, nDigits - 1);
error = Application.GetLastError();
if error == 0 then
sValue = String.TrimLeft(sValue, sIn);
nDigits = nDigits - 1;
else
sTotal = "";
bFigErr = true;
break;
end
end
if not bFigErr then
sTotal = nTotal.."";
end
return sTotal;
end


Pero no funciona completamente bien!, ya que apartir del digito 14, cambia totalmente el resto del resultado y da esto: "6.6370083614845e+033", y me parecio sumamente extraño que lo hiciera, asi que me puse a investigar en internet y encontré una particularidad llamada "especificación 754 del IEEE", que la nombran aca http://exceltotal.com/errores-de-precision-en-excel/ , asi que pence que el AMS era el que tenia dicha limitación asi que me fui al "Live" del mismo LUA (http://www.lua.org/cgi-bin/demo), y me dio el mismo resultado

Imagen

Hasta hice una prueba con la calculadora que trae "Google" y me el mismo resultado, osea,,, ningun programa puede calcular como lo hace el Haxial Calculator? (y así obtener el resultado correcto), y no solo se trata al combertir algo de algo, simplemente al hacer una suma sencilla y que el resultado sobrepase los 15 digitos, el AMS te da resultado erroneo, (creo que es redondeado, no sé, ),

¿Como podría resolver este problema?

Publicado: 16 Oct 2014 02:02
por Pabloko
es una cuestion de mas bajo nivel, lua utiliza int32 para manejar numeros, el mayor int32 que puedes tener es 2,147,483,647, asi que es un numero muy grande para ser gestionado.

te queda compilar lua con el parche lnum que provee al motor de lua de doubles e int64 con los que podras realizar la operacion

Re:

Publicado: 16 Oct 2014 03:47
por anchobeta
Pabloko escribió:es una cuestion de mas bajo nivel, lua utiliza int32 para manejar numeros, el mayor int32 que puedes tener es 2,147,483,647, asi que es un numero muy grande para ser gestionado.

te queda compilar lua con el parche lnum que provee al motor de lua de doubles e int64 con los que podras realizar la operacion
Imagen

Muy bien, me dispongo a googlear lo que me acabas de decir, para disponerme a hacerlo, gracias pabloko :) , por cierto, tu ya lo tienes parchado con eso?

Actualización!!!

Creo que la encontré, https://github.com/LuaDist/lualnum, pero no tengo ni la mas minima idea de como compilarlo ni parcharlo con el AMS :/, urgando por sus archivos encontré un README que dice como hacerlo, pero indica que se hace en LINUX, lo cual me parece realmente curioso ya que si AMS es para Windows, como rayos aría eso?, supongo que no es necesario el AMS, solamente el LUA, pero como quito el LUA del AMS?, me echan una mano, porfavor :friends: