Spara float i eeprom
Re: Spara float i eeprom
Nerre skrev :
> Binary scaling kan ju som sagt var göras med andra faktorer än bas 2, och då blir det inte längre samma sak som "fixed point".
> Så "fixed point" är binary scaling med en faktor med bas 2.
Det verkar som att "binary scaling" och "fixed point" har blivit omkastade i de där meningarna.
Jag skulle vilja skriva det så här :
"Fixed pont" kan ju som sagt var göras med andra faktorer än bas 2, men då blir det inte längre samma sak som "binary scaling".
Så "binary scaling" är [beräkningar] med "fixed point" med en faktor med bas 2.
D.v.s att man istället för att t.ex räkna med 100-tals sekunder (eller 10-dels sekunder)
räknar med t.ex 64-tals sekunder (eller vad som nu passar applikationen).
> Binary scaling kan ju som sagt var göras med andra faktorer än bas 2, och då blir det inte längre samma sak som "fixed point".
> Så "fixed point" är binary scaling med en faktor med bas 2.
Det verkar som att "binary scaling" och "fixed point" har blivit omkastade i de där meningarna.
Jag skulle vilja skriva det så här :
"Fixed pont" kan ju som sagt var göras med andra faktorer än bas 2, men då blir det inte längre samma sak som "binary scaling".
Så "binary scaling" är [beräkningar] med "fixed point" med en faktor med bas 2.
D.v.s att man istället för att t.ex räkna med 100-tals sekunder (eller 10-dels sekunder)
räknar med t.ex 64-tals sekunder (eller vad som nu passar applikationen).
Re: Spara float i eeprom
Nja, jag vidhåller nog att jag skrev dem åt rätt håll.
Med binary scaling så kan du t.ex. använda "tolftedelar" som minsta enhet, då har du inget fast decimalkomma nånstans i talet.
Binary scaling med bas 2 ger ett binärt "fixed point", binary scaling med bas 10 ger ett decimal "fixed point". Binary scaling med bas 7 ger ett octalt fixed point och binary scaling med bas 16 hexadecimalt fixed point.
Med binary scaling så kan du t.ex. använda "tolftedelar" som minsta enhet, då har du inget fast decimalkomma nånstans i talet.
Binary scaling med bas 2 ger ett binärt "fixed point", binary scaling med bas 10 ger ett decimal "fixed point". Binary scaling med bas 7 ger ett octalt fixed point och binary scaling med bas 16 hexadecimalt fixed point.
Re: Spara float i eeprom
> Med binary scaling så kan du t.ex. använda "tolftedelar" som minsta enhet,
Så tolkar jag inte de beskrivningar av "binary scaling" som jag har hittat.
Utan att det ska vara "halva", "fjärdedelar", "åttondelar", "sextondelar" eller
någon annan "del" som går jämt upp med basen 2. Därav "binary" i "binary scaling".
Sedan sker omvandling från/till det presentationsformat man vill ha före resp efter
själva beräkningarna (ofta decimala representationer).
Hela "grejen" med att göra binär skalning är ju att datorer/elektronik har mycket
lättare för beräkningar i just binära talsystem.
> Binary scaling med bas 7 ger ett octalt fixed point...
Borde det vara "8" där...
> binary scaling med bas 10 ger ett decimal "fixed point".
Basen 10 kan aldrig ge en "binary scaling". Det blir något slags BCD av det.
2, 8 och 16 är dock OK och ger en binär skalning.
Så tolkar jag inte de beskrivningar av "binary scaling" som jag har hittat.
Utan att det ska vara "halva", "fjärdedelar", "åttondelar", "sextondelar" eller
någon annan "del" som går jämt upp med basen 2. Därav "binary" i "binary scaling".
Sedan sker omvandling från/till det presentationsformat man vill ha före resp efter
själva beräkningarna (ofta decimala representationer).
Hela "grejen" med att göra binär skalning är ju att datorer/elektronik har mycket
lättare för beräkningar i just binära talsystem.
> Binary scaling med bas 7 ger ett octalt fixed point...
Borde det vara "8" där...

> binary scaling med bas 10 ger ett decimal "fixed point".
Basen 10 kan aldrig ge en "binary scaling". Det blir något slags BCD av det.
2, 8 och 16 är dock OK och ger en binär skalning.
Re: Spara float i eeprom
Vilken skalning man än väljer, binär, decimal eller annan, blir resultatet ändå att man använder samma sätt:
Multiplicera med ett värde och sedan dela med ett annat. Väl valda värden kan räknas ut med den upplösning man kan behöva, vill man "spä på" kan man ta en faktor 8-10 större.
Jag använder 64-bit tal på detta vis i vissa fall, det ger en mycket bra noggrannhet, stort värderegister och enkel beräkning och kännbart snabbare exekvering än float.
Multiplicera med ett värde och sedan dela med ett annat. Väl valda värden kan räknas ut med den upplösning man kan behöva, vill man "spä på" kan man ta en faktor 8-10 större.
Jag använder 64-bit tal på detta vis i vissa fall, det ger en mycket bra noggrannhet, stort värderegister och enkel beräkning och kännbart snabbare exekvering än float.
Re: Spara float i eeprom
Skit samma vad det heter!
Fixed point är användbart i vissa kontrollerade sammanhang. Problemet med fixed point är att man på förhand måste låsa hur många bitar man skall använda för heltalsdelen respektive decimaldelen. Om inparametrarna tillåts variera inom ett visst intervall dikterar det hur många bitars precision man kan använda i de olika beräkningsstegen i ett mer komplicerat uttryck. Det är väldigt lätt hänt att man får overflow i en multiplikation.
Detta problem finns inte med floating point eftersom exponenten och mantissan skalas efter varje operation så att man bibehåller precisionen genom ett långt uttryck.
Jag använde uteslutande fixed point i två relativt avancerade 3D-motorer jag byggde då det ännu lönade sig med fixed point på PC arkitekturen, så jag tror jag vet vad jag pratar om...

Fixed point är användbart i vissa kontrollerade sammanhang. Problemet med fixed point är att man på förhand måste låsa hur många bitar man skall använda för heltalsdelen respektive decimaldelen. Om inparametrarna tillåts variera inom ett visst intervall dikterar det hur många bitars precision man kan använda i de olika beräkningsstegen i ett mer komplicerat uttryck. Det är väldigt lätt hänt att man får overflow i en multiplikation.
Detta problem finns inte med floating point eftersom exponenten och mantissan skalas efter varje operation så att man bibehåller precisionen genom ett långt uttryck.
Jag använde uteslutande fixed point i två relativt avancerade 3D-motorer jag byggde då det ännu lönade sig med fixed point på PC arkitekturen, så jag tror jag vet vad jag pratar om...

Re: Spara float i eeprom
Skillnaden är ju att vid fixed point så kan du dela upp det binära värdet i ett heltal och en decimaldel.
Skalar man t.ex. med faktor 16 (och har 32-bitars ord) så får du 28 bitar heltal och 4 bitar decimaldel. Dessa kan, vid behov, hanteras var för sig.
Men skalar man med t.ex. faktor 12 så får du ingen fast decimalpunkt, du kan inte enkelt maska fram heltalsdelen och decimaldelen.
Skalar man t.ex. med faktor 16 (och har 32-bitars ord) så får du 28 bitar heltal och 4 bitar decimaldel. Dessa kan, vid behov, hanteras var för sig.
Men skalar man med t.ex. faktor 12 så får du ingen fast decimalpunkt, du kan inte enkelt maska fram heltalsdelen och decimaldelen.
Re: Spara float i eeprom
Enkelt och enkelt, det är ju inte svårare än:
heltalsdelen = talet / 12
decimaldelen = talet % 12
men du menara antagligen binär AND och bitskift med "maska fram", och det går ju förståss inte.
heltalsdelen = talet / 12
decimaldelen = talet % 12
men du menara antagligen binär AND och bitskift med "maska fram", och det går ju förståss inte.

Re: Spara float i eeprom
Nej, det var ju det jag menade.
Kan ju illustrera med 8-bitars ord.
Ett heltal blir "87654321." d.v.s. decimalpunkten är före bit ett.
Skalar vi med faktor fyra (2^2) blir det "876543.21" d.v.s. decimalpunkten mellan bit 2 och 3.
Skalar vi med faktor 16 (2^4) blir det "8765.4321" d.v.s. decimalpunkten mellan bit 4 och 5.
Men skalar vi med faktor 12 hamnar inte decimalpunkten på ett fast ställe, det blir alltså inte fixed.
Kan ju illustrera med 8-bitars ord.
Ett heltal blir "87654321." d.v.s. decimalpunkten är före bit ett.
Skalar vi med faktor fyra (2^2) blir det "876543.21" d.v.s. decimalpunkten mellan bit 2 och 3.
Skalar vi med faktor 16 (2^4) blir det "8765.4321" d.v.s. decimalpunkten mellan bit 4 och 5.
Men skalar vi med faktor 12 hamnar inte decimalpunkten på ett fast ställe, det blir alltså inte fixed.
Re: Spara float i eeprom
Nu skulle jag ju inte blanda mig i det här... men du har fel.
Om man skalar med 12 hamnar "decimalpunkten" visst på ett fast ställe, om man ser på talet i bas 12. Varför skulle man betrakta talet som ett bas 2 tal (binärt) om talet är i bas 12?
Enligt mig finns det ingen som säger att "fixed point" måste ses endast som *binära* tal. Fixed point betyder bara att decimalpunkten dvs gränsen mellan heltalsdelen och decimaldelen inte tillåts flytta på sig, såsom den gör i floating point.
Om man skalar med 12 hamnar "decimalpunkten" visst på ett fast ställe, om man ser på talet i bas 12. Varför skulle man betrakta talet som ett bas 2 tal (binärt) om talet är i bas 12?
Enligt mig finns det ingen som säger att "fixed point" måste ses endast som *binära* tal. Fixed point betyder bara att decimalpunkten dvs gränsen mellan heltalsdelen och decimaldelen inte tillåts flytta på sig, såsom den gör i floating point.
Re: Spara float i eeprom
Håller med mri.
Fixed point i sig betyder bara att decimalpunkten är "fixerad". Det
säger igentligen ingenting om vald "bas" för det hela. Det kan vara
rent binärt eller BCD (packed eller unpacked) eller något annat.
Binary scaling betyder dessutom att man har valt en decimaldel som
är en jämt 2-potens (för att underlätta och snabba upp multiplikationer
och divisioner).
Nu är detta inte speciellt rellevant om man enbart tittar på en enda byte,
så därför haltar Nerres jämförelse lite...
Fixed point i sig betyder bara att decimalpunkten är "fixerad". Det
säger igentligen ingenting om vald "bas" för det hela. Det kan vara
rent binärt eller BCD (packed eller unpacked) eller något annat.
Binary scaling betyder dessutom att man har valt en decimaldel som
är en jämt 2-potens (för att underlätta och snabba upp multiplikationer
och divisioner).
Nu är detta inte speciellt rellevant om man enbart tittar på en enda byte,
så därför haltar Nerres jämförelse lite...

Re: Spara float i eeprom
Jag mäter spänningar i millivolt med 16 bitars upplösning. Så länge jag håller mig till enheten millivolt så duger det med heltal, men när jag ska presentera resultatet i form av volt så kan man väl säga att jag använder mig av fixed point med basen 10 och har då tre decimaler. Den binära representationen blir då exakt densamma som millivolt, så jag behöver inte omvandla något. Man kan givetvis inte maska ut heltalsbiten ur detta tal binärt, viket jag inte heller behöver. Om jag sedan omvandlar talet till BCD eller ascii så vet jag var jag ska stoppa in decimalpunkten för att det ska bli rätt.
1234 millivolt = binärt 0000 0010 1101 0010
1.234 volt är fortfarande = binärt 0000 0010 1101 0011 med fixed point i basen 10 och tre decimaler.
Jag kan inte sätta någon punkt i det binära talet på ett visst ställe, men talet är fortfarande "fixed point" om jag uppfattat begreppet rätt.
1234 millivolt = binärt 0000 0010 1101 0010
1.234 volt är fortfarande = binärt 0000 0010 1101 0011 med fixed point i basen 10 och tre decimaler.
Jag kan inte sätta någon punkt i det binära talet på ett visst ställe, men talet är fortfarande "fixed point" om jag uppfattat begreppet rätt.
Re: Spara float i eeprom
Däremot om jag ska multiplicera detta tal med något annat (snabbt och effektivt i en microcontroller) så har jag ju inte så stor nytta av 10-basen ovan.
Antag att talet ska multipliceras med en 16 bitars konstant som har ett värde mellan 0 och 2. Då använder jag mig av enheten millivolt som 16-bitars heltal för det ena talet och konstanten binärt representerad som 1.15 dvs en heltalssiffra och femton binaler. Multiplicerar jag dessa 16-bitars tal med varandra som om de vore vanliga teckenlösa (unsigned) heltal så dividerar jag bara produkten med 32768 och får svaret. (32768 är alltså 2^15 - dvs motsvarar antalet binaler i binaltalet.)
(binal = som decimal, fast med basen två).
Antag att talet ska multipliceras med en 16 bitars konstant som har ett värde mellan 0 och 2. Då använder jag mig av enheten millivolt som 16-bitars heltal för det ena talet och konstanten binärt representerad som 1.15 dvs en heltalssiffra och femton binaler. Multiplicerar jag dessa 16-bitars tal med varandra som om de vore vanliga teckenlösa (unsigned) heltal så dividerar jag bara produkten med 32768 och får svaret. (32768 är alltså 2^15 - dvs motsvarar antalet binaler i binaltalet.)
(binal = som decimal, fast med basen två).