Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema en tipo de Datos.. (https://www.clubdelphi.com/foros/showthread.php?t=36967)

marceloalegre 30-10-2006 12:27:47

Problema en tipo de Datos..
 
Buen Dia: Les molesto porque necesito saber si es posible trabajar con nros. en el rango de los 20 digitos..

Necesitaria poder hacer cuentas con nros grandes. Estuve viendo que puedo usar por ejemplo un tipo variant y guardar hasta 19 digitos, pero necesito 20 para poder hacer cuentas de un pequeño desafio matematico que quiero resolver. Tengo alguna posibilidad de hacer esto? ya que no encuentro un tipo de datos mas grande que un int64 y me estoy quedando corto por un digito....

Otro tema seria tambien mostrarlo por pantalla por ejemplo (con 19 digitos.. si se puede con 20 voy a tener el mismo problema calculo...)
Código Delphi [-]
procedure ejemplo;
var
auxvar:variant;
begin
  auxvar:=1234567890123456789;//19 digitos... no da mas :(
  showmessage(IntToStr(auxvar));
end;
Bueno cuando ejecuto esto sale un amigable mensaje que me dice:
Desboramiento al convertir variant del tipo (Int64) al tipo integer. :( . Hay alguna salvedad para que esto se convierta correctamente?

Espero me puedan asistir en estas 2 cuestiones, Muchas gracias!

kuan-yiu 30-10-2006 12:37:25

Para empezar, en el código que pones no usas la conversión adecuada, prueba con "VarToStr". Porque nostrar números grandes en pantalla no debería ser un problema.

marceloalegre 30-10-2006 12:41:29

Sip.. perdón!, encontre varias maneras de convertir el tipo de datos... eso no termino siendo un problema,... el tema es trabajar con 20 digitos y poder hacer operaciones...! :(

Saludos!

seoane 30-10-2006 14:36:45

Estuve jugando un poco con esto de los números GRANDES, y he llegado hasta aquí. En ningún caso los algoritmos están optimizados, pero si no los quieres para nada muy serio te pueden servir.

Código Delphi [-]
type
  TSuperLargo = array[0..15] of Byte;

function AddSuper(var a,b: TSuperLargo; Acarreo: Integer): TSuperLargo; overload;
var
  i,j: integer;
begin
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) + Integer(b[i])) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function AddSuper(a,b: TSuperLargo): TSuperLargo; overload;
begin
  Result:= AddSuper(a,b,0);
end;

function SubSuper(a,b: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  for i := 0 to 15 do
    b[i]:= b[i] xor $FF;
  Result:= AddSuper(a,b,1);
end;

function MulSuper(a: TSuperLargo; b: Byte): TSuperLargo; overload;
var
  i,j: integer;
  Acarreo: Integer;
begin
  Acarreo:= 0;
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) * Integer(b)) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function ShiftLSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[0]:= 0;
  for i:= 0 to 14 do
    Result[i+1]:= a[i];
end;

function ShiftRSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[15]:= 0;
  for i:= 1 to 15 do
    Result[i-1]:= a[i];
end;

function MulSuper(a,b: TSuperLargo): TSuperLargo; overload;
var
  i: integer;
begin
  FillChar(Result,Sizeof(Result),0);
  for i:= 15 downto 0 do
  begin
    Result:= ShiftLSuper(Result);
    Result:= AddSuper(Result,MulSuper(a,b[i]));
  end;     
end;

function int64ToSuper(a,b: int64): TSuperLargo;
var
  i: integer;
begin
  for i:= 0 to 7 do
  begin
    Result[i]:= Byte((a shr (8*i)) and $FF);
    Result[i+8]:= Byte((b shr (8*i)) and $FF);
  end;
end;

procedure SuperToInt64(S: TSuperLargo; var a: int64; var b: int64);
var
  i: integer;
begin
  for i:= 7 downto 0 do
  begin
    a:= (a shl 8) + S[i];
    b:= (b shl 8) + S[i+8];
  end;
end;

Con esto puedes hacer operaciones simples: suma, resta, multiplicación, desplazamientos, la división se me antojaba muy complicada ;)

Código Delphi [-]
// Ejemplo
var
  a,b: TSuperLargo;
  x,y: int64;
begin
  a:= int64ToSuper(1000,0);
  b:= int64ToSuper($2222,$5533);
  b:= AddSuper(a,b);
  SuperToInt64(b,x,y);
end;

En fin, si quieres realizar algo un poco serio, encontraras librerías en Internet para manejar números grandes, pero para algo sencillo esto te puede servir.

marceloalegre 30-10-2006 15:52:08

Uh!!! muchas gracias por tanto trabajo seoane!
Esta muy bueno lo que veo, le voy a dar marcha a esto.
Igual, te cuento que no me quedo otra que usar otro lenguaje para salir del apuro...
Resulta que java tiene el tipo de datos BigDecimal y acepta cualquier cosa :) no me meti de lleno en como lo hace... pero funciona bien ... es una pena q nuestro querido delphi no cuente con estas cosas :( ...

Saludos!

seoane 30-10-2006 16:09:13

Hola kanvictor, me estaba preguntando como estaban implementados esos BigDecimal en Java y se me ocurrió que pueden usar un sistema parecido al tipo Currency en Delphi. Pero ten en cuenta que este tipo de datos pueden almacenar datos tan grandes a cambió de perder precisión, haz la prueba, almacena un valor muy GRANDE en una variable bigdecimal, sumale 1 y comprueba que ese cambio se ve reflejado en la variable.


La franja horaria es GMT +2. Ahora son las 05:11:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi