Avatar billede mollevp Nybegynder
30. oktober 2005 - 18:48 Der er 18 kommentarer og
1 løsning

Matematik / accuracy problem..

Hej jeg sidder og er ved at lave en hashing funktion til en mobil-telefon.. Jeg har en implementering på PC der dur, men når jeg implementere det samme på mobile opstår der problemer - jeg håber der er nogle der kan hjælpe mig her:

PC Implementering:
unsigned char bits=(unsigned char)(log((double)100000)/log(2.));

Mobil:
double num, div;
Math::Ln(num, TableLen);
Math::Ln(div, 2.);
unsigned char bits=(unsigned char) (num / div);

I PC udgaven bilver bits = 16
I Mobil udgaven er bits = 17

Når bits er 17 gør den at jeg senere kommer til indeksere forkert i min hash-tabel...

Nogle gode ideer til ting jeg kan afprøve??
Avatar billede mollevp Nybegynder
30. oktober 2005 - 18:49 #1
Math::Ln(num, TableLen); <-- Her er TableLen self. 100000
Avatar billede arne_v Ekspert
30. oktober 2005 - 19:01 #2
16 er rigtigt

floating point resulatet er ca. 16.61

prøve at udskrive num og div på mobil for at se om det giver hints til
hvor det går galt
Avatar billede mollevp Nybegynder
30. oktober 2005 - 19:12 #3
num = 11.512930
div = 0.693147
og det giver jo en 16.6 - så der er vel fint..

Her går det så galt:
unsigned char bits= (unsigned char)(num / div);

Når jeg udskriver bits får jeg 17..
Avatar billede mollevp Nybegynder
30. oktober 2005 - 19:13 #4
hov: num og div ovenfor er udskrevet fra telefonen.. Så problemet ligger i divisionen jeg forstår det bare ikke?
Avatar billede arne_v Ekspert
30. oktober 2005 - 19:16 #5
ja mystisk den runad af i.s.f. ned

hvad giver (unsigned char)(int)(num / div) ?

og hvad giver (unsigned char)floor(num / div) ?
Avatar billede mollevp Nybegynder
30. oktober 2005 - 19:23 #6
Lavede lige et mellemresultat:

double result = (num / div);

Printer 16.609640

Prøvede lige den cast du foreslog:

unsigned char bits = (unsigned char)(int)result;

Printer 17

Jeg har ikke en floor() på mobilen, så den kan jeg ikke teste.. Er det ikke totalt wierd?
Avatar billede arne_v Ekspert
30. oktober 2005 - 19:38 #7
unsigned char bits = (unsigned char)(result - 0.5);

måske ??

(det ser absurd ud, men ...)
Avatar billede mollevp Nybegynder
30. oktober 2005 - 19:43 #8
Det virker faktisk arne... men det er da utroligt at der skal den slags hacks til - hvad tror du årsagen er til problemet?
Avatar billede arne_v Ekspert
30. oktober 2005 - 19:50 #9
af en eller anden mystisk grund så vælger den CPU at runde af og ikke ned
ved konvertering fra double til int
Avatar billede arne_v Ekspert
30. oktober 2005 - 19:50 #10
hvilket så vidt jeg ved er ukorrekt i forhold til ANSI C
Avatar billede mollevp Nybegynder
30. oktober 2005 - 23:33 #11
Arne takker for hjælpen, smid et svar..
Avatar billede arne_v Ekspert
31. oktober 2005 - 08:32 #12
ok
Avatar billede mollevp Nybegynder
31. oktober 2005 - 11:15 #13
Arne jeg ville lige høre, jeg sidder og kigger lidt docs. Det er en 16bit ARM CPU der sidder i mobilen, siger det dig noget om hvad der er galt?

Jeg har googlet en masse, men jeg kan ikke lige finde noget der gør det klokkeklart for mig, hvad der går galt..
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:33 #14
Jeg har aldrig programmeret ARM.
Avatar billede bertelbrander Novice
31. oktober 2005 - 21:49 #15
Hvilken type ARM? Jeg har aldrig hørt om en 16bit, er det en der kører i thumb mode?
Hvilken compiler?
Og jeg er enig, det er et underligt resultat, den bør runde ned. Der bør være en floor funktion til compileren.
Avatar billede mollevp Nybegynder
31. oktober 2005 - 22:17 #16
Hej Bertel, det var oxo forkert med de 16 bit.. det er en:
Processor: 32-bit RISC CPU based on ARM-9 series, 104 MHz

Jeg builder til ARMI executable.. Det er en VS.net compiler..
Avatar billede bertelbrander Novice
31. oktober 2005 - 22:46 #17
104 MHz, det tyder på en GSM/GPRS mobil?
Har du checket om der er en floor funktion? Der bør være én i math/cmath/math.h
Jeg har ikke brugt VC.net på en ARM...
Avatar billede mollevp Nybegynder
31. oktober 2005 - 23:15 #18
Det er en Nokia 6600. Problemet er lidt at mobilen kører Symbian OS, der har sit eget Math library, og heri findes der ikke en floor funktion.. Jeg har set at Symbian har tilføjet et ANSI C math library af kompatibilitet årsager, jeg har dog ikke eksperimenteret med at bruge det endnu - håbede lidt jeg kunne bruge Symbians standard math bibliotek.

Jeg fik lige sagt noget vrøvl: jeg bruger gcc til at kompilere til ARM processoren, og VS.net til x86 (bruger jeg i en emulator)

Jeg har desuden lige opdaget at det kun er i emulatoren at problemet eksistere, jeg gik dumt nok ud fra at det oxo ville være et problem på telefonen - jeg har dog lige lavet et test program der giver de rigige resultater på selve telefonen.. Men i emulatorer viser det forkerte resultat.. Så meget for den emulator..

Det må vel nærmest være en fejl i det SDK jeg bruger?
Avatar billede bertelbrander Novice
01. november 2005 - 00:13 #19
En fejl i emulatoren.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester