Radšej by som to upravil takto:
n = n * 993711 + 523147;
return n >> 16;
Příspěvky odeslané z IP adresy 89.173.13.–
Martin napsal:
Ja bych to chtěl udělat nějak takhle jestli je to možné ?
#include <math.h>
#include <stdio.h>
int main(void)
{
int uh;
scanf("%d", &uh);
double sin (double uh){ return sin(uh);}
/*tady je ta fela*/
return 0;
}
tam pravě nevim jak vypsat hodnotu toho sinu
Co to je za syntax deklarovat funkciu vo funkcii a este k tomu rekurzivnu... :-o
Vo windowse je to fukcia GetTickCount() a vracia počet tisícin sekund od spustenia systému.
unsigned int rnd()
{
static unsigned int n = 1234567890;
n *= 993711;
return n;
}
Náhodné číslo v rozsaju 0-0xffffffff
Pseudonáhodne číslo využíva neusporiadanosť iracionálnych čísel.
Na zvýšenie účinnosti treba zakomponovať chaos.
Napríklad:
n = (n * 993711 + 523147) >> 16;
return n & 0xffff;
Náhodné číslo v rozsaju 0-0xffff
Aký má zmysel robiť so 16b asm, čo to je za kravinu. To v dnešnej dobe neni použitelné. Treba sa učiť C jazyk a v ňom používať ASM procedúry. Také interrupty ako INT21H a ostatné BIOSovské sú dead.
Pravdepodobne ti nefunguje BIOS, tak skús DOS službu:
MOV AH, 01h
INT 21h
No snad jedine tak, že to rozparzuješ v C jazyku s fread() ako program, skompiluješ s listingom do ASM a listing skopiruješ do vlastného MASM zdrojáku. Neexistje konkrétne makro, ktoré presne dokáže to čo potrebuješ. Musíš to naprogramovaťa najjednoduchšie je to v C.
Nemá zmysel poúžívať iba MASM. Efektívnejšie je použiť C a v ňom používaťASM procedúry.
Každý počítač vlastní špecialny časový číp 8259, ktorý volá HW interrupt 08h +8.2 krát za sekundu. Stačí zistit adresu obslužnej rutiny tohto interruptu a vložiťdo nej vlastný kód a potom ešte zavolat predošĺu rutinu na zabezpečenie kompatibility. Alebo pužiť SW iterrupt 1aH a po návrate je v CX,DX registroch počet taktov od posledného resetu. Lenže takto to funguje iba v 16b DOSe. Vo Windowse s tým sú problémy a nedovoluje prepisovať HW interrupty.
Tak potom:
unsigned long n;
__asm {
call GetTickCount
mov n, eax
}
Vo widnsowse treba použiť jeho funkcie, inak sa to nedá...
Parametre funkcie zaberaju vzdy 4B. Lokalne premenne sa nevyberaju zo zasobnika s POP a tak moze mat i 1B. Polia zoberu zo zasobnika celu velkost toho pola, cize 'int n[10]' si ukusne 40B. Lenze mam taky dojem, ze i lokalne premmene sa zarovnavaju v zasobniku na 4B, pretoze citanie numerickych hodnot z pameti je rychlejsie z adres delitelnych 4. Niektore CPU dokonca nedokazu z neparnej adresy vobec citat data. Intel sa prisposobi, ale spomaluje to kod. Cize pre optimalizaciu kodu moze kompilator pre 1B premennu vyhradit 4B v zasobniku...
To k : Kompilator jazyka C vklada do kodu specialnu proceduru na kontrolu pretecenia zasobniku. Tato procedura sa vykonava na zaciatku kazdej volanej funkcie. Potom, pred volanim nejakej funkcie kompilator uklada vsetky parametre funkcie do zasobnika a vo funkcii sa hodnoty tych parametrov zo zasobnika citaju. Zasobnik je bufer na rychle predavanie datovych hodnot a v ASM su na nu specialne instrukcie. Ale je zbytocne toto studovat. Pouzitie ASM v C nepotrebuje volat inu fukciu. ASM v C sluzi na zrychlenie nejakych specialnych rutin.
Vlozit ASM do C mozes takto:
void main()
{
int a = 123;
__asm {
mov eax, a
add eax, 200
mov a, eax
}
printf("a=%d\n", a);
}
ASM pricita do premennej 'a' hodnotu 200 a potom normalne s printf sa hodnota vypise...