🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: chile.comp.programacion
Article #2583

Re: Portar codigo C entre maquinas de 32/64 bits?

#2583
From: Andres E. Hernando
Date: Tue, 13 Dec 2005 05:45
85 lines
4269 bytes
On 12 Dec 2005 23:55:53 -0400, "Jos? Miguel Santib??ez" wrote:
> En el cap?tulo anterior (news:40656sF18epvjU1@individual.net), "Andres E. 
> Hernando" <NOherSPnandoAM@fas.harvard.edu> dijo:
> 
>> Hola!
>>      
>>      Seguro que estoy poniendo en evidencia lo oxidado que
>> estoy, pero mi copia del Kernighan y Ritchie esta juntando 
>> polvo en Chile y necesito arreglar esto antes de irme...
>> 
>>      Bueno, por alguna razon (no importa cual) tengo que
>> usar un generador de numeros pseudoaleatorios externo en 
>> Matlab. Por un tema de eficiencia, lo estoy haciendo en C
>> usando mex files.
>> 
>>      El PRNG (Pseudo Random Number Generator) que tengo que
>> usar es una version de KISS (Keep It Simple, Stupid) que usa
>> operaciones de bits en uno de sus generadores. Basicamente,
>> la siguientes lineas:
>> 
>>      y  ^= y << 13;
>>      y  ^= y >> 17;
>>      y  ^= y <<  5;
>> 
>>      Donde y es un numero de 32 bits... Y aqui esta todo
>> mi problema, porque tengo que compartir esto y tiene que 
>> funcionar igual en maquinas de 32 y de 64 bits. Por lo que 
>> declarar y como "unsigned long int" no me funciona ya que 
>> en la maquina Linux donde tiene que correr, un "unsigned
>> long int" es de 64 bits, asi que los shifts/xor me generan
>> resultados distintos en cada maquina.
>> 
>>      Estoy seguro que debe haber una forma de asegurarme
>> que y es siempre de 32 bits independiente de la arquitectura, 
>> pero hace como 4 annos que no programo en C... Algun puntero
>> a la ayuda adecuada?
>> 
> 
> Puede que la mia sea una pregunta weona, pero si es un PRNG, no veo cual es 
> el error de que entregue resultados diferentes en cada m?quina....

	No es la primera vez que me hacen la pregunta, y no,
no es una pregunta 'weona'... Lo que pasa es que tengo un proceso 
de bootstrap que corre en Stata que es un paquete estadistico que 
usa esta implementacion particular de KISS. Despues, tengo el 
mismo proceso con una etapa mas corriendo en Matlab y quiero que
los resultados sean comparables mas alla de la muestra (la razon
de correrlo en Matlab es que la etapa extra requiere de una 
optimizacion no lineal en un espacio de 36 parametros, Matlab
es mucho mas eficiente haciendo eso que Stata).

	Por eso necesito que tanto Stata como Matlab
generen la misma muestra en cada simulacion. Cada simulacion
requiere de +/- 36.000.000 de PRN, por eso necesito tener
un PRNG con caracteristicas conocidas (y que esten acomplados
en ambas aplicaciones de modo de poder comparar).

	En el fondo, quiero un experimento pseudo aleatorio,
pero que sea repetible (i.e. si pongo la misma semilla en
ambos programas me generen la misma secuencia de PRN).

	Se entiende?
> 
> En todo caso, yo revisar?a la doc de la plataforma para buscar el 
> equivalente (INT32?) 

	Por ahora lo que hice fue eso, pero ahora tengo dos 
versiones de las rutinas, una que usa UINT en la maquina de
64 bits y otra que usa ULINT en la de 32. Despues cache que
da +/- lo mismo porque en la de 32 ULINT = UINT. Pero si
a alguien se le ocurre tirarlas a correr en un bicho distinto
puede que ya no sea lo mismo...

	En fin, todavia esta corriendo, cuando pare voy
a tratar de implementar todo usando arreglos de chars
como sugirieron por ahi.

	Saludos,
	AHG.

-- 
Mi sig could kick your sig's butt anyday!
msn: a_hernand@msn.com
http://diferenciados.blogspot.com/  <-- mi huebloj!
http://www.humanclock.com/clock.php <-- mi reloj!
Technical Details
Message-ID: <4075f1F18utn8U1@individual.net>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
References: <40656sF18epvjU1@individual.net> <Xns972B13AEF2F27jmsnews@200.27.221.71>

Show Full Headers
Complete Article Headers
X-Google-Thread: 1593cb,88c16e828b86c7df
X-Google-Attributes: gid1593cb,public
X-Google-Language: SPANISH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: "Andres E. Hernando" <NOherSPnandoAM@fas.harvard.edu>
Newsgroups: chile.comp.programacion
Subject: Re: Portar codigo C entre maquinas de 32/64 bits?
Date: 13 Dec 2005 05:45:06 GMT
Lines: 85
Message-ID: <4075f1F18utn8U1@individual.net>
References: <40656sF18epvjU1@individual.net> <Xns972B13AEF2F27jmsnews@200.27.221.71>
X-Trace: individual.net GuT8ewh93bhYLxez+/pl/AWqJ/qVtgTHfwsBg9gUEE3Ir/nbeQ
X-Orig-Path: not-for-mail
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (CYGWIN_NT-5.1/1.5.18(0.132/4/2) (i686))