Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
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: 26
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
  #2  
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: 22
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
  #3  
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: 26
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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 21:39:56.


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