Dela med 10 utan matte-bibliotek

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26622
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Dela med 10 utan matte-bibliotek

Inlägg av Icecap »

Om det hade varit sommar ute kontinuerligt är vi överens men för tillfället är det så pass kallt att värdet är negativt.

Och ja, i detta sammanhang (DS18B20) är det i grunden utan värde att ha en så pass snabb dela-med-10 rutin för att visa temperaturen med decimaler - men det är en grej jag har letat efter ett tag, mest för att om det nu var enkelt och snabbt...
bearing
Inlägg: 11668
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Dela med 10 utan matte-bibliotek

Inlägg av bearing »

Behöver man dividera med 10 för att få temperaturen ur en DS18B20?
Användarvisningsbild
Icecap
Inlägg: 26622
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Dela med 10 utan matte-bibliotek

Inlägg av Icecap »

Såklart inte! Men vill man visa värden som xx,x°C är det ganska bra att kunde dela med 10.

Denna delning med 10 är mest tänkt som en generell grej, det är ofta att jag vill visa värden på det vis och det har inte alltid med temperaturer att göra.

I en DS18B20 kan man ju läsa temperaturen med en bra bit finare upplösning än 0,5°C - att den sedan inte är kalibrerat ordentligt så att det har rimligt värde är en annan sak - men relativ mätning är bra också om man letar tendens.
bearing
Inlägg: 11668
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Dela med 10 utan matte-bibliotek

Inlägg av bearing »

Aha, du menar när man ska ska skriva ut variabler på en display, eller på typ serieporten. Ja det är klart, då behöver man ju alltid dividera med 10 några gånger, oavsett om det ska visas som decimaltal eller inte.
Användarvisningsbild
Icecap
Inlägg: 26622
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Dela med 10 utan matte-bibliotek

Inlägg av Icecap »

Exakt! Och hade man en snitsig lite o snabb rutin ville det vara kul. Men det är tydligen mest att glömma detta.
ie
EF Sponsor
Inlägg: 1371
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Dela med 10 utan matte-bibliotek

Inlägg av ie »

Eller så sätter man bara decimalkommat på lämpligt ställe...
Användarvisningsbild
Icecap
Inlägg: 26622
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Dela med 10 utan matte-bibliotek

Inlägg av Icecap »

ie: Helt klart en möjlighet - men i en µC med få resurser behöver man då att antingen:
* Skriva ut till minnet och sedan dumpa ut på korrekt sätt.
* Eller dela med 10 och skriva kommat mellan heltalet av div/10 och remainder.

Båda delar är inte helt resurssnåla, varför det då är lika bra (eller bättre) att faktisk använda divisionslibbet.

Så nej, inget bra förslag heller.
Nerre
Inlägg: 27168
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Dela med 10 utan matte-bibliotek

Inlägg av Nerre »

Eh...

123 delat med 10 är 12.3

123 med en punkt mellan sista och näst sista siffran blir 12.3
bearing
Inlägg: 11668
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Dela med 10 utan matte-bibliotek

Inlägg av bearing »

Men alltså om du har en variabel som ska skickas i klartext över UART, då måste du ju dividera med rest för varje siffra som ska skickas. Jag antar att det är detta tråden handlar om. Sen kan man ju skicka med ett kommatecken på lämplig plats, ifall man önskar.
Användarvisningsbild
Icecap
Inlägg: 26622
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Dela med 10 utan matte-bibliotek

Inlägg av Icecap »

Nerre: Nej! 123 / 10 ger 12,3 - i Sverige iaf. Är du i USA eller andra inkontinenta ställen med konstiga värden kan det bli 12.3

bearing: du har fattat helt korrekt!
gkar
Inlägg: 1578
Blev medlem: 31 oktober 2011, 15:28:29
Ort: Linköping

Re: Dela med 10 utan matte-bibliotek

Inlägg av gkar »

Vill du verkligen dividera snabbt och har en snabb mul så kan du göra det med en multiplikation istället i lämpliga intervall.

a = (a * 6554) >> 16;
Ta ARM tex som saknar HW division men har en mycket snabb multiplikation, då rockar detta!


Ännu mycket mer tokfort är att använda en tabell.
Skapa en tabell som innehåller alla tal du vill skicka.

Låt data lite Motorola 68020+ idag för omväxlingsskull.

; Lägg data i d0.w
snabbprint:
lea tab(pc,d0.w*8),a0 ; Ta adressen på tabellen relativt PC, lägg på PC, ta d0.w och multiplicera med 8 och lägg ihop allt i a0. *2 eller *4 för småtabeller.
bsr.s uart_send_null_termed_string ;a0 innehåller adressen att skriva ut från.
rts

Detta tar alltså en assemblerinstruktion att skapa informationen som printrutinen behöver!



tab:
'0', NULL, NULL, NULL, NULL, NULL, NULL, NULL
'1', NULL, NULL, NULL, NULL, NULL, NULL, NULL
...
'4','2', NULL, NULL, NULL, NULL, NULL, NULL
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Dela med 10 utan matte-bibliotek

Inlägg av Andax »

Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46878
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Dela med 10 utan matte-bibliotek

Inlägg av TomasL »

Icecap skrev:ie: Helt klart en möjlighet - men i en µC med få resurser behöver man då att antingen:
* Skriva ut till minnet och sedan dumpa ut på korrekt sätt.
* Eller dela med 10 och skriva kommat mellan heltalet av div/10 och remainder.

Båda delar är inte helt resurssnåla, varför det då är lika bra (eller bättre) att faktisk använda divisionslibbet.

Så nej, inget bra förslag heller.
Det där förstår jag faktiskt inte, eftersom du ändå måste formatera utskriften till displayen, så, tar det knappast några resurser att placera decimalkommat på rätt ställe.
Samma gäller att skicka värdena med via serieport, det är väl en smart sak att låta mottagaren få hantera eventuella decimaler, bara man skickar konsekvent, dvs alltid med samma mängd decimaler.
Dessutom tjänar man på det då man kan använda heltalsaritmetik överallt.
sodjan
EF Sponsor
Inlägg: 43242
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Dela med 10 utan matte-bibliotek

Inlägg av sodjan »

Ha! Den algoritmen har jag nog (konstigt nog) aldrig sett.
Trevlig läsning, speciellt "Historical" på slutet...
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4743
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Dela med 10 utan matte-bibliotek

Inlägg av Swech »

ditt tal = X (byte)

Y = X * 51 (word)
Z =Y*256 + Y (24 bit)
Z = Z / 65536 (8 bit)
Z = Z/2

Swech
Skriv svar