Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2006
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Question 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!
Responder Con Cita
  #2  
Antiguo 30-10-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
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.
Responder Con Cita
  #3  
Antiguo 30-10-2006
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
Question

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!
Responder Con Cita
  #4  
Antiguo 30-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 30-10-2006
Avatar de marceloalegre
[marceloalegre] marceloalegre is offline
Miembro Premium
 
Registrado: abr 2005
Ubicación: Mar del Plata - Argentina
Posts: 448
Poder: 20
marceloalegre Va por buen camino
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!
Responder Con Cita
  #6  
Antiguo 30-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Tipo de datos no coincide Genner SQL 5 08-05-2006 17:14:40
Tipo de base de datos CARSOFT_AR Varios 6 06-02-2006 17:49:26
Urg: Problema con el tipo IDirectDrawSurface DarkByte Varios 2 31-08-2005 21:53:51
Tipo de datos Letty Conexión con bases de datos 4 13-01-2004 21:19:48
Problema con Tipo de Campo hjuarez Conexión con bases de datos 2 30-08-2003 05:16:15


La franja horaria es GMT +2. Ahora son las 07:37:59.


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
Copyright 1996-2007 Club Delphi