|
| Heltals division med 2 og shift right logi~ Fra : Paminu |
Dato : 25-01-06 23:18 |
|
For de computer interesseret. Hvis man laver shift right logical (srl) med 1
på et tal angivet i binær notation svarer det så ikke til at lave heltals
division med 2?
eks:
1101 bin = 13 dec
efter srl:
0100 bin = 4 dec
der svarer til 13 DIV 2 = 4 hvor rest = 1.
findes der ikke en kortere betegnelse for heltalsdivision?
| |
Uffe Kousgaard (25-01-2006)
| Kommentar Fra : Uffe Kousgaard |
Dato : 25-01-06 23:28 |
|
"Paminu" <sdf@asd.com> wrote in message
news:dr8ti0$61o$1@news.net.uni-c.dk...
> For de computer interesseret. Hvis man laver shift right logical (srl) med
1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?
Jo. Mange compilere kan selv finde ud af at lave denne lille finte. Jeg
kender mest "srl" som "shr" (shift right).
> 1101 bin = 13 dec
>
> efter srl:
>
> 0100 bin = 4 dec
>
> der svarer til 13 DIV 2 = 4 hvor rest = 1.
13 DIV 2 = 6 = 0110
> findes der ikke en kortere betegnelse for heltalsdivision?
Tror jeg ikke, DIV eller heltalsdivision anvendes normalt.
hilsen
Uffe
| |
Ulrik Smed (26-01-2006)
| Kommentar Fra : Ulrik Smed |
Dato : 26-01-06 01:41 |
|
Uffe Kousgaard wrote:
> "Paminu" <sdf@asd.com> wrote in message
> news:dr8ti0$61o$1@news.net.uni-c.dk...
>> der svarer til 13 DIV 2 = 4 hvor rest = 1.
>
> 13 DIV 2 = 6 = 0110
Og resten på 1 ligger i carryflaget.
--
Ulrik Smed
Aarhus, Denmark
| |
Martin Larsen (25-01-2006)
| Kommentar Fra : Martin Larsen |
Dato : 25-01-06 23:59 |
|
Paminu fortalte:
>
>
> findes der ikke en kortere betegnelse for heltalsdivision?
Joh, nogen bruger "/" til rationel division og har så en funktion der
omregner til float, hvis man ønsker det.
Nogen bruger "\" til heltalsdivision.
Mvh
Martin
--
Entia non sunt multiplicanda praeter necessitatem
| |
Per Abrahamsen (26-01-2006)
| Kommentar Fra : Per Abrahamsen |
Dato : 26-01-06 09:01 |
|
"Paminu" <sdf@asd.com> writes:
> For de computer interesseret. Hvis man laver shift right logical (srl) med 1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?
Jeps, det er et gammelt trick. Specielt da en del ældre cpu'er slet
ikke har haft heltalsdivision.
> findes der ikke en kortere betegnelse for heltalsdivision?
I C hedder det "/". Hvilket leder til mange fejl, i C gælder det at
(1 / 3) * 3 == 0
hvilket kommer som en overraskelse for de fleste.
Jeg foretrækker klart "div".
| |
Uffe Kousgaard (26-01-2006)
| Kommentar Fra : Uffe Kousgaard |
Dato : 26-01-06 09:05 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjirs7zadr.fsf@sheridan.dina.kvl.dk...
>
> I C hedder det "/". Hvilket leder til mange fejl, i C gælder det at
>
> (1 / 3) * 3 == 0
>
> hvilket kommer som en overraskelse for de fleste.
Hvad hedder almindelig division så i C ?
| |
Bertel Lund Hansen (26-01-2006)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 26-01-06 09:50 |
|
Uffe Kousgaard skrev:
>> (1 / 3) * 3 == 0
>> hvilket kommer som en overraskelse for de fleste.
> Hvad hedder almindelig division så i C ?
Det hedder også /. Det er jo det der er forvirrende. Hvis man
skal bruge decimaltal, skal man tvinge det:
1.0/3=0.33333...
(double) 1/3=0.33333 ....
Reglen er at man enten skal have et flydende kommatal som et af
tallene eller også skal man caste til den type. I modsat fald får
man heltalsdivision.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/
| |
Torben Ægidius Mogen~ (26-01-2006)
| Kommentar Fra : Torben Ægidius Mogen~ |
Dato : 26-01-06 10:25 |
|
Bertel Lund Hansen <nospamfilius@lundhansen.dk> writes:
> Uffe Kousgaard skrev:
>
> >> (1 / 3) * 3 == 0
>
> >> hvilket kommer som en overraskelse for de fleste.
>
> > Hvad hedder almindelig division så i C ?
>
> Det hedder også /. Det er jo det der er forvirrende. Hvis man
> skal bruge decimaltal, skal man tvinge det:
>
> 1.0/3=0.33333...
> (double) 1/3=0.33333 ....
>
> Reglen er at man enten skal have et flydende kommatal som et af
> tallene eller også skal man caste til den type. I modsat fald får
> man heltalsdivision.
Jeg er enig med Bertel om, at det er forvirrende i C. Men det skyldes
ikke kun, at den samme operator bruges på flere forskellige typer
(overloading), men at overloading kombineres med automatisk
konvertering mellem heltal og flydende kommatal, hvilket betyder at
man som programmør skal vide præcis hvor de automatiske konverteringer
bliver sat ind for at vide om en division er mellem heltal eller
flydende kommatal. F.eks. er
(double) 1/3=0.33333
mens
(double) (1/3) = 0.0000
Ligeledes er
(double) ((x = 1)/3)
lig med 0.0000, hvis x er en heltalsvariabel mens det er 0.33333, hvis
x er en kommatalsvariabel.
Torben
| |
Torben Ægidius Mogen~ (26-01-2006)
| Kommentar Fra : Torben Ægidius Mogen~ |
Dato : 26-01-06 09:29 |
|
"Paminu" <sdf@asd.com> writes:
> For de computer interesseret. Hvis man laver shift right logical (srl) med 1
> på et tal angivet i binær notation svarer det så ikke til at lave heltals
> division med 2?
>
> eks:
>
> 1101 bin = 13 dec
>
> efter srl:
>
> 0100 bin = 4 dec
>
> der svarer til 13 DIV 2 = 4 hvor rest = 1.
Når du bruger srl (logisk højreskift), er et skift med n bit det samme
som division med 2^n, men kun for ikke-negative tal. For tal, der kan
være negative, skal du bruge aritmetisk højreskift, som adskiller sig
fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
i tokomplementrepræsentation.
For venstreskift er der ikke forskel på logisk og arimetisk skift,
idet der altid skiftes nuller ind.
Endvidere findes der i nogle processorer en højre/ventreskift med
mente, som skifter menten (carry) ind som det nye bit og lægger det
udskiftede tal ind i menten. Det muliggør skift af tal, der fylder
mere end et maskinord. Dette kan dog kun gøres med et-bits skift.
> findes der ikke en kortere betegnelse for heltalsdivision?
Der er ikke nogen udbredt standard for en kort notation. Nogle sprog
bruger "/" til både heltalsdivision og division med kommatal, og
vælger mellem de to operationer ud fra argumenternes typer. Andre
bruger "/" til kommatal og enten "\" eller "//" til heltal. Men hvis
man ikke har en kontekst (f.eks. et programmeringssprog), der
tydeliggør meningen, bør man altid forklare, hvad man mener med
f.eks. "\" eller "//".
Torben
| |
Martin Larsen (26-01-2006)
| Kommentar Fra : Martin Larsen |
Dato : 26-01-06 12:46 |
|
"Torben Ægidius Mogensen" fortalte:
> Andre
> bruger "/" til kommatal og enten "\" eller "//" til heltal.
Jeg kender kun "//" som rationel division.
Iøvrigt - mon ikke rationel division efterhånden bliver standard inventar
i ethvert sprog? måske ligefrem erstatter alt andet.
Mvh
Martin
--
Hvem fortalte dig, at du var nøgen?
| |
Lasse Reichstein Nie~ (26-01-2006)
| Kommentar Fra : Lasse Reichstein Nie~ |
Dato : 26-01-06 18:46 |
|
"Martin Larsen" <mlarsen@post7.tele.dk> writes:
> Iøvrigt - mon ikke rationel division efterhånden bliver standard
> inventar i ethvert sprog? måske ligefrem erstatter alt andet.
Næppe så længe der er hardwareunderstøttelse for IEEE floatingpoint-
aritmetik, og ikke for regning med rationelle tal.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL: http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
| |
Martin Larsen (26-01-2006)
| Kommentar Fra : Martin Larsen |
Dato : 26-01-06 20:19 |
|
Lasse Reichstein Nielsen fortalte:
> "Martin Larsen" <mlarsen@post7.tele.dk> writes:
>
>> Iøvrigt - mon ikke rationel division efterhånden bliver standard
>> inventar i ethvert sprog? måske ligefrem erstatter alt andet.
>
> Næppe så længe der er hardwareunderstøttelse for IEEE floatingpoint-
> aritmetik, og ikke for regning med rationelle tal.
>
Hmm, bemærk at der er 2 trin i min formodning - det sidste bliver
naturligvis ikke aktuelt før ældre systemer virker for antikverede.
Iøvrigt - som rationelle implementeres i dag har man vist ikke hensyn til
eksponenten. Måske skulle man have rationelle med rationel eksponent og
standard for arrays (algebraiske). Så ville folk være fri for at skrive
programmer der løser 2.gradsligninger
Mvh
Martin
--
Thou shalt break them with a rod of iron
| |
Kurt Kjær Jensen (26-01-2006)
| Kommentar Fra : Kurt Kjær Jensen |
Dato : 26-01-06 19:38 |
|
Torben Ægidius Mogensen wrote:
> "Paminu" <sdf@asd.com> writes:
>
>
>>For de computer interesseret. Hvis man laver shift right logical (srl) med 1
>>på et tal angivet i binær notation svarer det så ikke til at lave heltals
>>division med 2?
>>
>>eks:
>>
>>1101 bin = 13 dec
>>
>>efter srl:
>>
>>0100 bin = 4 dec
>>
>>der svarer til 13 DIV 2 = 4 hvor rest = 1.
>
>
> Når du bruger srl (logisk højreskift), er et skift med n bit det samme
> som division med 2^n, men kun for ikke-negative tal. For tal, der kan
> være negative, skal du bruge aritmetisk højreskift, som adskiller sig
> fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
> betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
> i tokomplementrepræsentation.
Bortset fra særtilfældet -1, som strander på -1 uanset antal højreskift
med sign-extension (-1 i 8 bit to-komplement er 11111111).
> For venstreskift er der ikke forskel på logisk og arimetisk skift,
> idet der altid skiftes nuller ind.
Ja, hvis det er i to-komplement repræsentation. Venstreskift giver helt
forkert resultat i ét-komplement repræsentation.
--
Venlig hilsen
Kurt
| |
Torben Ægidius Mogen~ (27-01-2006)
| Kommentar Fra : Torben Ægidius Mogen~ |
Dato : 27-01-06 09:22 |
|
Kurt Kjær Jensen <slettes_kkjen_slettes@aub.dk> writes:
> Torben Ægidius Mogensen wrote:
>
> > "Paminu" <sdf@asd.com> writes:
> >
> >> For de computer interesseret. Hvis man laver shift right logical
> >> (srl) med 1 på et tal angivet i binær notation svarer det så ikke
> >> til at lave heltals division med 2?
> >>
> >>eks:
> >>
> >>1101 bin = 13 dec
> >>
> >>efter srl:
> >>
> >>0100 bin = 4 dec
> >>
> >>der svarer til 13 DIV 2 = 4 hvor rest = 1.
> > Når du bruger srl (logisk højreskift), er et skift med n bit det
> > samme
> > som division med 2^n, men kun for ikke-negative tal. For tal, der kan
> > være negative, skal du bruge aritmetisk højreskift, som adskiller sig
> > fra det logiske højreskift ved at kopiere fortegnsbittet (det mest
> > betydende bit) ind i de "nye" bit. Det giver korrekt division for tal
> > i tokomplementrepræsentation.
>
> Bortset fra særtilfældet -1, som strander på -1 uanset antal
> højreskift med sign-extension (-1 i 8 bit to-komplement er 11111111).
Det er da rigtigt nok. Heltalsdivision af ulige tal skal runde
resultatet ned, og floor(-1/2) = -1.
Mange programmeringssprog tillader dog heltalsdivision runde mod nul i
stedet for at runde ned, hvilket gør at man ikke kan bruge højreskift
til division med (potenser af) to. Og det er ikke kun -1, der er et
særtilfælde, alle ulige negative tal giver forskellige resultater med
afrunding nedad eller afrunding mod 0.
Selv om man runder mod nul, kan man alligevel udnytte højreskift til
division med to, hvis man blot AND'er med -2 først.
En kuriositet er, at programmeringssproget C ikke specificerer om
heltalsdivision skal runde ned eller runde mod 0. Så hvis du laver et
program, dr forudsætter f.eks. runding mod 0, kan du ikke være sikker
på, at det fungerer med alle C compilere. Dog skal reglen
(x/y)*y+(x%y)=x være opfyldt også for negative x eller y.
Selv foretrekker jeg klart runding nedad, idet det betyder at x%y
altid ligger mellem 0 og y-1, at (x+y)%y = x%y, og andre rare
algebraiske egenskaber. Og så er det også mere effektivt for division
med toerpotenser.
> > For venstreskift er der ikke forskel på logisk og arimetisk skift,
> > idet der altid skiftes nuller ind.
>
> Ja, hvis det er i to-komplement repræsentation. Venstreskift giver
> helt forkert resultat i ét-komplement repræsentation.
Ja, men jeg forudsatte jo netop også tokomplement.
Torben
| |
|
|