» »

[c++] Izpis večjega števila, if ali abs?

[c++] Izpis večjega števila, if ali abs?

djtey ::

Pozdrav!

Vpišemo naprimer dve števili, zdaj pa nevem, kako bi naredil, da ti izpiše večjo število??:\

LP
  • spremenil: Vesoljc ()

Vesoljc ::

bi prosil, da si malo bolj natancen...
dej primer!
Abnormal behavior of abnormal brain makes me normal...

djtey ::

Napišiti program, ki zahteva od uporabnika vnos dveh števil. Program nato izpiše večje število.

Kami ::

Ja simple, npr da je spremenljivka za prvo število st1 za drugo pa st2 potem pa daš

....
if (st1 > st2) 
  cout << "Stevilo 1 - " << st1 << " je vecje od stevila 2";
else
  cout << "Stevilo 2 - " << st2 << " je vecje od stevila 1";
.....

Zgodovina sprememb…

  • spremenil: Kami ()

Kami ::

No drugače je tu cela koda:

#include <iostream.h>

int main()
{
  int st1, st2;
  cout << "Vnesi stevilo 1:\n";
  cin >> st1;
  cout << "Vnesi stevilo 2:\n";
  cin >> st2;
  if (st1 > st2) 
  cout << "Stevilo 1 - " << st1 << " je vecje od stevila 2";
  else
  cout << "Stevilo 2 - " << st2 << " je vecje od stevila 1";
}

djtey ::

Tnx vsem!

Vesoljc ::

if (st1 > st2) 
cout << "Stevilo 1 - " << st1 << " je vecje od stevila 2";


ahhhh....

if (st1 > st2) 
   cout << "Stevilo 1 - " << st1 << " je vecje od stevila 2";
Abnormal behavior of abnormal brain makes me normal...

Thomas ::

vecje=(x+y+abs(x-y))/2
Man muss immer generalisieren - Carl Jacobi

MaCoFaCo ::

To pa je procesorsko požrešno :P

Thomas ::

Je ja.
Man muss immer generalisieren - Carl Jacobi

snow ::

Sam pa ni branchinga :)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

MaCoFaCo ::

Ko smo že pri tem. A funkcijo abs(x) se da implementirat enostavno tako da "izniči" bit za predznak. Torej dejansko brez branchinga?
V praksi pa je to najverjetneje narejeno ravno z branchingom ane?

Kak offtopic:)

Thomas ::

Nič off topic in JE brez branchinga.
Man muss immer generalisieren - Carl Jacobi

Quikee ::

ja abs ma branching... vsaj ta v VC++ 6.0

Thomas ::

Hehe .. jebo C++, če ne zna zadeve prevesti brez branchinga!
Man muss immer generalisieren - Carl Jacobi

Quikee ::

Thomas: Ves algoritem za abs brez branchinga?

Thomas ::

Seveda vem.
Man muss immer generalisieren - Carl Jacobi

Quikee ::

Te pa povej prosim.

Thomas ::

Bom.
Man muss immer generalisieren - Carl Jacobi

Quikee ::

eh ni treba vec.. sem ze najso. =)

int v; // we want to find the absolute value of v
int r; // the result goes here

r = (v ^ (v >> (sizeof(int) * CHAR_BIT - 1))) -
(v >> (sizeof(int) * CHAR_BIT - 1));

Thomas ::

Ni dobr. Tukaj se pri prevajanju komot skriva kakšen skokec. Ni dobr.

Tole je bolš:

CMOVGTZ R1, R2, R3 // if (R1 > 0) R2 = R3
CMOVLTZ R1, R2, R3 // if (R1 < 0) R2 = R3
CMOVEQZ R1, R2, R3 // if (R1 ==0) R2 = R3

Samo ni čist dober še?
Man muss immer generalisieren - Carl Jacobi

Quikee ::

dvomim, ker je pisano za cpu-je, kjer je branching drag. CHAR_BIT je tak konstanta in sizeof(int) recimo, da tudi.. tak da mas:

r = (v ^ (v >> 31)) - (v >> 31); kar pa pomeni samo shift, xor in minus.

MaCoFaCo ::

ABS(R1)
{
   MOV R3, R1 //R3 = R1
   CMOVGTZ R1, R2, R3 // if (R1 > 0) R2 = R3

   MOV R3, 0
   SUB R3, R1 //R3 = -R1
   CMOVLTZ R1, R2, -R3 // if (R1 < 0) R2 = R3

   CMOVEQZ R1, R2, R3  // if (R1 ==0) R2 = R3
   RETURN R2
}

snow ::

and eax,0x7fffffff
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Quikee ::

snow: ne.. ti dobis v primeru 1 (0000 00001) na izhod (0000 0001), v primeru -1 (1111 1111) pa dobis 127 (0111 1111)... kar pa ni 1 (0000 0001). =) (v primeru 8 bitnih registrov).

Zgodovina sprememb…

  • spremenil: Quikee ()

snow ::

eh ja :)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

snow ::

abs:

MOV EDX,EAX
SAR EDX,31
XOR EAX,EDX
SUB EAX,EDX
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

Good!
Man muss immer generalisieren - Carl Jacobi

Thomas ::

V glavnem ... vse skoke se da porazirat. Sploh vse. Edino je vprašanje, če je smiselno. Včasih je branching najcenejši. Ne za abs.
Man muss immer generalisieren - Carl Jacobi

snow ::

//8x 16-bit
short a[8];
short b[8];
short max[8];

movdqa xmm1,xmmword ptr [a]
pmaxsw xmm1,xmmword ptr [b]
movdqa xmmxword ptr [max],xmm1


analogno za 16x8bit(char), sam da so prej arrayi po 16 charov, pa instrukcija je pmaxsb.
:D
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

Thomas ::

djtey, jest upam da smo ti kej pomagali. :D
Man muss immer generalisieren - Carl Jacobi

djtey ::

Hvala vsem!!;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Zakaj mi program ne dela?

Oddelek: Programiranje
141156 (705) M.B.
»

Python - naloga z računanjem

Oddelek: Programiranje
132094 (1571) ktka

[C#]naloga iz metod!

Oddelek: Programiranje
81674 (1507) Ziga Dolhar

[C#] naloga iz metod

Oddelek: Programiranje
221642 (1402) Mavrik
»

[C#] število manjše proti večjemu

Oddelek: Programiranje
10775 (671) detroit

Več podobnih tem