Problém se vzorcem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problém se vzorcem – C / C++ – Fórum – Programujte.comProblém se vzorcem – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
oxidián0
Věrný člen
10. 3. 2015   #1
-
0
-

mám takovýto vzorec Umax = 3 * 2^Level-2 - 1 ... který jsem opsal, ale mělo by to správně být takto:

3 * (2^Level-2) - 1

Level je hodnota od 0 do 15.

Tabulka výsledků, jak mají být správně:

Umax = 3 * 2{level-2} - 1
8 bits    |     Posun = 2*level-2 exp.    result Umax=HEX
                 0 -4   2*-2      -4      0
                 0 -2   2*-1      -2      0
000000000000000010 0    2*0        0      2      0x02     
000000000000000101 1    2*1        2      5      0x05
000000000000001011 2    2*2        4      11     0x0B
000000000000010111 3    2*3        6      23     0x17
000000000000101111 4    2*4        8      47     0x2F
000000000001011111 5    2*5       10      95     0x5F
000000000010111111 6    2*6       12      191    0xBF
000000000101111111 7    2*7       14      383    0x17F
000000001011111111 8    2*8       16      767    0x2FF
000000010111111111 9    2*9       18      1535   0x5FF  
000000101111111111 10   2*10      20      3071   0xBFF                   
000001011111111111 11   2*11      22      6143   0x17FF
000010111111111111 12   2*12      24      12287  0x2FFF
000101111111111111 13   2*13      26      24575  0x5FFF
001011111111111111 14   2*14      28      49151  0xBFFF
010111111111111111 15   2*15      30      98303  0x17FFF
101111111111111111 16   2*16      32      196607 0x2FFFF

Používám tento kód:

int Umax, Vmax, level=2;
for (;level<19;level++){
      Umax = 3 * ipow(2,level-2) - 1; // ipow je mocnina integeru
}

Schválně jsem přeskočil první dva výsledky. To co dostávám během ladění:

1. level == 2  ; level - 2 == 0 ; umax == -1 ... špatně ale budiž, jdu na další cyklus:

2. level == 3  ; level - 2 == 1 ; umax == 11 !!! Vůbec jsem nedostal 2 a 5, dvě hodnoty to přeskočilo

3. level == 4  ; level - 2 == 2 ; umax == 47    přeskočilo to hodnotu 23 !!! Prostě nechápu...

Funkce ipow kód jsem uvedl v předchozím vlákně

Nahlásit jako SPAM
IP: 78.45.199.–
Reklama
Reklama
vitamin+8
Grafoman
10. 3. 2015   #2
-
0
-

#1 oxidián
zrejme mas chybu v ipow, skus spustit toto:

for(int level = 1; level < 19; ++level){
	if((int)pow(2, level) != ipow(2, level))printf("chyba pri exp == %d\n", level);
    }
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ondrej39+1
Věrný člen
10. 3. 2015   #3
-
0
-

#1 oxidián
Hoď sem i definici ipow funkce, z tvého vzorku nepoznáme dost.

Nahlásit jako SPAM
IP: 195.113.207.–
Inject all the dependencies!
vitamin+8
Grafoman
10. 3. 2015   #4
-
+1
-
Zajímavé

#3 ondrej39
Ved pouzi pow a vysledok pretypuj na int, ak ti ide o rychlost tak mocniny 2 si sprav cez switch(jump table) a bude to ovela rychlejsie.

Inak ipow moze vyzerat takto:


int ipow(int base, int exp){
    if(exp < 0)return 0;
    int res = 1;

    while(exp--)res *= base;
	
    return res;
}
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
oxidián0
Věrný člen
10. 3. 2015   #5
-
0
-

Jo já jak jsem dělal ty pokusy s tou funkcí ipow2 tak jsem zaměnil ipow za ipow2 a tím jsem tam dal nefunkční kód. A teď jsem tu funkci upravil a je to OK, až na to, že mi to nevypisuje ten první stav - když level je 2 má vyjít 2. Když začnu s level=1 tak to stejně bude ignorovat první výsledek respektive UMax mi vyšlo -1.

int ipow(int base, int exp)
{
	if (exp<=0)
		return 0;
    int result = 1;
    while(exp--) result *= base;
    return result;
}
Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Věrný člen
10. 3. 2015   #6
-
0
-

#4 vitamin
Jak to myslíš přes switch, co dát do switche, ten bit?

Nahlásit jako SPAM
IP: 78.45.199.–
ondrej39+1
Věrný člen
10. 3. 2015   #7
-
+1
-
Zajímavé

#5 oxidián
Taky máš ten kód blbě, máš tam if (exp<=0), takže i když bude exponent 0, tak se ti vrátí nula, ale když je exponent nula, má se ti vrátit 1, nula se ti má vrátit pouze ve chvíli, kdy exponent bude menší než nula, ne menší nebo roven nula.

Nahlásit jako SPAM
IP: 195.113.207.–
Inject all the dependencies!
oxidián0
Věrný člen
10. 3. 2015   #8
-
0
-

Musím se přiznat, že jsem pow nezkoušel protože jsem viděl syntaxi s double. A teď tam dávám pow s integer a ono to normálně jede bez problému. A ten můj vzorec při level=0 a ipow vrací -1 kdežto s pow to vrací 0. Takže stejně nefunguje správně. Ale teď když vím že pow funguje i s integer tak jsem si jen hezky procvičil binární algebru, ale jinak mi ta funkce je k ničemu a můžu ji vyhodit :-)

A ještě k tomu vzorci

Umax = 3 * (2^(level-2)) - 1

Teď jsem si uvědomil že jednodušší je to počítat takto:

předchozí_hodnota*2+1 mazec. Já stále nechápal proč tam je ta 3ka na začátku a nechápu to do teď, ale jako x*2+1 je podstatně jednodušší vyjádření a myslím že bude i rychlejší na výpočet!

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Věrný člen
10. 3. 2015   #9
-
0
-

Tak mi dejte vědět jestli smím založit nové vlákno nebo to mám napsat sem, mám nový problém a sice že nerozumím jednomu vzorci na rozklad čísla. Napíšu to sem a pokud nikdo nezareaguje tak to samžu a dám jako nové vlákno.

Funkce f(x) dekomprimuje vstupní hodnotu x (bajt) o základu "base-4"
(opsáno nevím co je base-4) snad pochopíte z následujícího
:

 
x = a3.4^3 + a2.4^2 + a1.4^1 + a0.4^0 = a3.64 + a2.16 + a1.4 + a0

 a3 - a0 jsou nejspíš označení číslic


příklad se vstupní hodnotou 0x4B

a3 = 1, a2 = 0, a1 = 2, a0 = 3 (0x4B = 75 = 1 x 64 + 0 x 16 + 2 x 4 + 3)

0x4B = 75 = 1 x 64 + 0 x 16 + 2 x 4 + 3

Nechápu ten rozklad jak k tomu došli nikde nic není vysvětleno. třeba tady jsou jen 2 číslice tak nechápu s čím autor toho vzorce počítal a co je 1x64 . Dokáže někdo z vás něco vyčíst z toho vzorce? A jestli jo tak vysvětlit mi to abych to pochopil? Vůbec si nedovedu představit ty 4 čísla odkud je mám vzít abych mohl postupovat podle toho vzorce...

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV+42
God of flame
10. 3. 2015   #10
-
0
-

To jsou zaklady pozicnich ciselnych soustav. Soustava ma nejaky zaklad a pozici.

Napriklad desitkove cislo:

1234.56     prvni cislice nalevo od desetinne tecky ma pozici 0. Dale nalevo pak pozice 1, pozice 2  ...

tj.   4 na pozici 0, 3 na pozici 1, 2 na pozici 2, 1 na pozici 3. Zaklad soustavy umocneny pozici pak dava hodnotu.

tj.   4*10^0 + 3*10^1 + 2*10^2 + 1*10^3

A za desetinnou carkou jsou exponenty (aka pozice) zaporne. V souhrnu:

3 2 1 0. -1 -2
1 2 3 4.  5  6
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Věrný člen
10. 3. 2015   #11
-
0
-

No a číslo v mém případě je 75. Tam nejsou 4 pozice jak to je ve vzorci. Mám si to představit jako 0075? Proč tam je 1x64 a ne 0x64? Kde vzal tu jedničku? Vidím tam čísla 1 0 2 3 ale jak se k nim dostal?

Nahlásit jako SPAM
IP: 78.45.199.–
lukas.balaz0
Super člen
10. 3. 2015   #12
-
+1
-
Zajímavé

Lebo to je v štvorkovej sústave (1023 je 75 v desiatkovej).

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 80.242.41.–
KIIV+42
God of flame
11. 3. 2015   #13
-
0
-

#11 oxidián
75 = 0b1001011 = 1*2^6 + 0*2^5+ 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 64 + 8 + 2 + 1

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Věrný člen
11. 3. 2015   #14
-
0
-

#12 lukas.balaz
o čtverkové soustavě slyším poprvé. Ani nic takového na internetu jsem nenašel. Nějaký odkaz na prostudování? Jak se tomu říká česky? Nebo poziční soustava a štvorcová sústava je jedno a totéž? Se omlouvám ale slovensky moc neumím.

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV+42
God of flame
11. 3. 2015   #15
-
0
-

#14 oxidián
no nebudu to tu zbytecne vypisovat, kdyz je to na netu:

http://cs.wikipedia.org/wiki/Poziční_číselná_soustava

Jsou tam zminene ty klasicke jako binarni (zaklad 2), octalova (zaklad 8), desitkova (prekvapive zaklad 10), hexadecimalni (zaklad 16).

Ale hned na zacatku je zmineno, ze zaklad je libovolne cele cislo vetsi nez 1. Takze muzes mit trojkovou, ctyrkovou, petkovou, sestkovou soustavu... klidne si muzes rict, ze budes mit soustavu o zakladu 100000... jen musis byt schopen rozeznat tolik jednotlivych znaku - aby se ti nepletly pozice a nemohl si ze stejne reprezentace interpretovat vic ruznych cisel

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Věrný člen
11. 3. 2015   #16
-
0
-

Jo už to čtu a našel jsem "Názvy soustav se v češtině tvoří odvozením ze jména pro číslice" ... takže mi to už je jasné

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Věrný člen
11. 3. 2015   #17
-
0
-

K té čtvercové soustavě - tak teď už vím že 75 je 1023 ale nevím jak se k tomu číslu dostat. To číslo 1023 rozložit umím

1*4^3 + 0*4^2 + 2*4^1 + 3*4^0
64    + 0     +  8 + 3 = 75

U desítkové 75/10 a mám 70 ale u čtvercové 75/4 a mám 18. Mám tedy dělit 18 opakovaně 4? Pak mám 4 a půl. A jak mám teď vědět, že na začátku bude jednička a na kolikátou to mám mocnit? To jako že dvakrát jsem to dělil, tak (2+1)-krát to budu mocnit? A co ta jednička?

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Věrný člen
11. 3. 2015   #18
-
0
-

Už jsem to asi pochopil. Takže tady je můj postup na převod 75 na 1023:

Asi musím brát v potaz celá čísla, která jsou mocninou 4:
x^1, x^2, x^3,  x^4
4,    16,   64,  256, atd.
Jak velká mocnina o základu 4 se vleze do 75? 64.

1x64 + zbytek je 11
1x4^3 + ...

Dále hledám která mocnina se vleze do zbytku.

Druhá mocnina (16) se do 11 nevleze proto 0:
1x4^3 + 0x4^2 +

První mocnina (4) se do 11 vleze dvakrát:
1x4^3 + 0x4^2 + 2x4^1
mám 8 a do 11 zbývá 3 (trojka se 4ka se neumocňuje)

1x4^3 + 0x4^2 + 2x4^1 + 3x4^0 = 1023

Jsem dobrý co?

To je to co dělá ta funkce tady:

http://programujte.com/forum/vlakno/29007-prevod-souradnic-z-uint32-t-na-float/

nejdříve hledá kolikátá mocnina se vleze do určitého čísla a výsledek je
shiftValue.
 

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 68 hostů

Podobná vlákna

Pole se vzorcem — založil Kano.net

Problém s $this — založil Marty

Problém s i++ — založil Chazz

Problem s VS C# — založil Mrakoplas

Problém s VC++ — založil beb

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý