
Aritmetik och Assembler
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Multiplikation i C
Det tillsammans med att veta hur exakt man behöver svaret kan göra stor skillnad! Ett par exempel: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.
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.
Re: Multiplikation i C
Kolla i denna tråd med olika metoder att dividera
http://elektronikforumet.com/forum/view ... 4&start=15
http://elektronikforumet.com/forum/view ... 4&start=15
Re: Multiplikation i C
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å.
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å.
Re: Multiplikation i C
> 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.
De två brukar ha ett väldigt nära samband.
Mer som två olika namn på samma sak.
Re: Multiplikation i C
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.

Desto närmre Assembler, desto mindre resurser.
Föredömligt jämförande arbete och presentation.



-
- Inlägg: 1043
- Blev medlem: 2 juli 2010, 23:04:07
Re: 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.Erik M skrev:Är detta en effektiv, och fungerande, multiplikation i C?
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.
Aritmetik och Assembler was: Multiplikation i C
Jag kommer fram till att division ser ut på detta vis:
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.
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
}
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.
Re: Aritmetik och Assembler
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
}
Re: Aritmetik och Assembler
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.
Även om det ovan är vad C egentligen gör vid * respektive ÷.
Dumt av mig.

Re: Aritmetik och Assembler
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.
Många PICar i 18-serien och däröver har det.
- Swech
- EF Sponsor
- Inlägg: 4744
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Aritmetik och Assembler
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
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