21. november 2003 - 11:44Der er
12 kommentarer og 2 løsninger
Alternativ til float datatype
Jeg arbejder på en applikation, hvor hukommelse er en sparsom ressource.
Jeg skal lagre en masse kommatal, men floats fylder for meget. Findes der ikke et kommatal i 2bytes udgave? Jeg kunne anvende en integer og så dividere ned. Men der er ikke effektivt.
Det er til noget væskedynamik i 3D - så DET SKAL GÅ STÆRKT!!!
Jeg kunne godt tænke mig at undersøge hvordan det lige er man arbejder uden floating points. Det er noget med en masse defines man skal bruge. Kender nogen nogle gode ressourcer til sådan noget?
Svaret afhænger vel af hvilken præcision du skal have. Hvis du blot skal gemme tal med decimaler, kan du lave din egen datatype med et par funktioner til at konvertere frem og tilbage mellem float. Hvis du skal regne på din datatype, bliver det straks sværere - og så bliver der også problemer med afrundingsfejl, som kan have stor betydning i så komplekse beregninger. En søgning på fixed-point arithmetic i google giver en del resultater.
TAX: du er godt klar over at du mister en enorm precision som kan betyde at videre behandling af dine data kan give andre resultater efter at du har gemt og hentet igen, se kaos-teori.
Jeg er klar over at jeg kan bruge en short, og blot dividere den med en fast værdi for at få værdien. Men divisioner er dyre. Derfor tænkte jeg at der måske var et alternativ.
En ide:
Man kunne bruge en short (2bit heltal), og shifte bits for at få den ind i en float's mest betydende cifre?
Det ville gå meget hurtigere end at dividere normalt.
I princippet er det vel muligt hvis du ved nok om exponenter, matrisser og hvordan de fysisk gemmes at udlede dette. Jeg tvivler dog på at floats der er presset ind i 2 byte beholder precission nok til ikke at gøre beregningerne værdiløse.
//et par defines, du må selv afgøre, hvilken præcision, der skal bruges: //en byte til heltalsdel, en byte til brøk: #define precision 8 #define fix2float(x) (((float)(x))>>precision) #define float2fix(x) ((short)((x)<<precision))
Det er fixed point i 16 bit med en scale på 16. Lidt usædvaneligt med en scale som ikke er en potens af 10, men det er selvfølgeligt nødvendigt for at kunne shifte i.s.f. at dividere.
Hvis dine tal ligger i det rigtige range (ca. -2000..2000) og du kan leve med en regne unøgagtighed op til 37.5%, så er det fint.
arne_v: du har sikkert ret i det med at shifte en float - det giver nok ingen mening, i det hele taget er problemet nok, at der ikke er en fornuftig løsning med de givne betingelser...
En af pionererne indenfor kaos- og kompleksitetsteorien er Edward Lorentz. Han beskæftigede sig som udgangspunkt med meteorologi og var fascineret af vejrets omskiftelighed, og meteorologernes problemer med at forudsige vejret ganske få dage ud i fremtiden: Her hober fejl og unøjagtigheder sig op i systemet, hvorefter de tilsidst resulterer i uforudsigelige vejrsituationer. Lorentz opstillede en oversimplificeret vejrmodel med 3 ligninger. Ved imidlertid at ændre modellens initialværdier med 1/1000, ændrede modellens opførsel sig fuldstændigt (se bilag 1). Lorentz indså herefter, at "ethvert fysisk system, der opfører sig ikke-periodisk, er uforudsigeligt."
Jeg lavede nogle forsøg med at shifte nogle bits og caste til en mindre type. Det virkede, men jeg er ikke færdig med at virdere præcisionen af metoden.
Jeg kender ikke engang området værdierne ligger i i min appliktion endnu.
Det med 2 byte floating points, må jeg prøve, men indtil videre har jeg problemer nok blot med at få det til at spille med floats alene.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.