Aritmetik och Assembler

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Multiplikation i C

Inlägg av lillahuset »

:tumupp:
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: Multiplikation i C

Inlägg av thebolt »

sodjan skrev: Om den ena parametern i multiplikationen skulle råka vara en konstant
så går det ofta att optimera rutinen för just det värdet.
Det tillsammans med att veta hur exakt man behöver svaret kan göra stor skillnad! Ett par exempel:

I geometrihanterande kod (grafik, fysik, spel osv) är det ganska vanligt att du jämför längden mellan två punkter (dvs en vektor) med en konstant, i princip rotenUr(blah) <= C där C är en konstant. Roten-ur är _väldigt_ dyr, så det är alltid bättre att göra blah <= C^2.

Annat exempel: En mjukvara vi har som kör på Cortex-M4 processorer har sin huvudsakliga tidhantering i form av 64-bitars heltal som anger microsekunder sen start. Vanligaste operationen är subtraktion, och det är rätt snabbt även om hårdvaran inte hanterar 64-bitars tal. Däremot finns det ett fåtal ställen där vi behöver millisekund eller sekund, men istället för att behöva dividera med 1000 (i mjukvara) så definierar vi att faktorn är 1024 (dvs bitshift med 10) som totalt ger ett par bitshift och ett par bitoperationer. Avsevärt snabbare och felet på 2.4% per steg är acceptabelt i denna tillämpning.
persika
EF Sponsor
Inlägg: 1349
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: Multiplikation i C

Inlägg av persika »

Kolla i denna tråd med olika metoder att dividera
http://elektronikforumet.com/forum/view ... 4&start=15
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Multiplikation i C

Inlägg av Erik M »

Prestanda är inte problemet. Tidsnöd är.

Jag låter inte bli att lyssna, lillahuset. Ledsamt om du tror så.

sodjan, det där var helt korrekt. Så länge det är så.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Multiplikation i C

Inlägg av Erik M »

Persika - tack. :tumupp:
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Multiplikation i C

Inlägg av Swech »

vad är det för processor då?
Troligtvis PIC ?

Swech
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Multiplikation i C

Inlägg av Erik M »

Swech - Det är Assembler, renskrivet.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Multiplikation i C

Inlägg av sodjan »

> Prestanda är inte problemet. Tidsnöd är.

De två brukar ha ett väldigt nära samband.
Mer som två olika namn på samma sak.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Multiplikation i C

Inlägg av Erik M »

persika har visat problemet på ett ypperligt vis här.
Desto närmre Assembler, desto mindre resurser.
Föredömligt jämförande arbete och presentation.
:bravo: :bravo: :bravo:
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

Re: Multiplikation i C

Inlägg av Findecanor »

Erik M skrev:Är detta en effektiv, och fungerande, multiplikation i C?
Nja, För positiva (och "unsigned" tal), om du ändrar till att använda shift-operationer. Om du roterar x så kommer x aldrig att bli 0 (om x inte var 0 från början) och rutinen kommer att loopa för evigt.
Man bör ha koll när man multiplicerar så att y och p inuti rutinen har plats för så många giltiga bittar som antal giltiga bittar i x + antal giltiga bittar i y, men ifall att det inte skulle vara fallet så bör variabeln y också skiftas istället för att roteras för resultatet ska bli "fel-korrekt" vid overflow.

På plattformar utan egen multiplikations-instruktion så borde * - operatorn expandera till ett anrop till en väloptimerad rutin som använder samma metod. Det borde vara mer effektivt att använda den då.
Men om du på en sådan plattform ska göra flera multiplikationer med samma x så tror jag att det skulle det kunna vara snabbare att göra alla i en loop på det här sättet.

Om x är en konstant så vore det bättre att "rulla ut" loopen, t.ex.
p = y * 5; => p = y + (y<<2);
Men en bra kompilator borde göra samma sak.
Senast redigerad av Findecanor 28 augusti 2016, 17:19:36, redigerad totalt 1 gång.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Aritmetik och Assembler was: Multiplikation i C

Inlägg av Erik M »

Jag kommer fram till att division ser ut på detta vis:

Kod: Markera allt

q = 0		
r = x		
while x - q * y > 0		
{		
	r = x - q * y	
	e = 0	
	while r > y	
	{	
		e = e + 1
		r = r / 2
	}	
	e = e - 1	
	q = q + 2^e	
}
Blir det rätt, månne?

Jag ser att ämnet behöver bytas...

Och, som synes, använder jag en C-liknande syntax för att förenkla beskrivningen av kod.
Koden i sig skrivs i Assembler.
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Aritmetik och Assembler

Inlägg av Erik M »

Multiplikationen i början torde se ut såhär:

Kod: Markera allt

p = 0		
while x ≥ 1	// eg x ≠ 0	
{		
	if x.0 = 1	
	{	
		p = p + y
	}	
	x = x / 2	
	y = y * 2	
}
Erik M
Inlägg: 1380
Blev medlem: 23 februari 2012, 18:34:39
Ort: Göteborg

Re: Aritmetik och Assembler

Inlägg av Erik M »

Det var ju jädra dumt att jag frågade om C.
Även om det ovan är vad C egentligen gör vid * respektive ÷.

Dumt av mig. :wall:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Aritmetik och Assembler

Inlägg av TomasL »

Inte nödvändigtvis, har processorn HW stöd för multiplicering så använder en vettig C-kompilatorn det i stället för kod.
Många PICar i 18-serien och däröver har det.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Aritmetik och Assembler

Inlägg av Swech »

När du nu kör i Assembler är det den mest relevanta frågan vilken processor det rör sig om.
Fråga nr två i sammanhanget, hur stora tal handlar det om
Nr 3, är det signed eller unsigned.

Assembler är inte ett generiskt språk utan är helt beroende av processor.
Dina skrivexempel är inte heller i "assembler" utan i något hittepå språk nära C, Pascal ... whatever.

Så om du vill seriöst ha hjälp så beskriv istället vad du pysslar med istället för att
vända och vrida på problemet tills övriga säger att din lösning, oavsett hur den är, är korrekt
och du har rätt i ditt tänkande.

Swech
Skriv svar