Avatar billede elster Nybegynder
08. juni 2004 - 10:19 Der er 11 kommentarer og
1 løsning

readDouble() implementation til MIDP

Hej!

Jeg har en MIDP (J2ME) klient, der forbinder til en server vha. sockets. Dette virker også helt fint. Men serveren benytter DataOutputStream.writeDouble() til nogle af de meddelelser der sendes ud til klienten. Dvs. at jeg i klienten skulle have benyttet DataInputStream.readDouble() for at få den tal-værdi serveren sender. Men da MIDP ikke understøtter double typen og derfor heller ikke DataInputStream.readDouble(), kan jeg jo ikke umiddelbart få tal-værdien. Serveren kan der ikke laves om i.

Jeg har allerede en klasse hvorved jeg kan repræsentere en double værdi. Dette virker ved at benytte to int værdier i klassen. Hvis den ene værdi er 2 og den anden er 129, så ved jeg at værdien f.eks. er 1,29 (2 decimaler efter komma). Så det er altså ikke noget problem at double typen ikke findes i MIDP.

Det jeg mangler er "bare" noget kode der kan omforme de 8 bytes der sendes fra serveren, når den kalder DataInputStream.writeDouble(), til f.eks. sådanne to heltals-værdier som er nævnt ovenfor. Eller bare noget andet MIDP kompatibelt kode så jeg kan se hvad det er for en værdi serveren sender.

I Sun's source kode kan jeg se at de benytter nedenstående kode til at læse en double:
------------------------------------------------
long heltal = readLong();
double kommatal = Double.longBitsToDouble(heltal);
------------------------------------------------

Men dette hjælper mig heller ikke, da der ikke er kode til Double.longBitsToDouble() metoden. Hvordan får jeg ovenstående long værdi ("heltal"), koverteret på en måde så jeg kan se hvilken værdi serveren sender..??
Avatar billede arne_v Ekspert
08. juni 2004 - 10:31 #1
Du finder en beskrivelse af IEEE 64 bit floating point format og fisker bitsene ud.

Eller hvilket er 700 gange nemmere: ændrer server kode til at sende de 2 int
i.s.f. en double.
Avatar billede arne_v Ekspert
08. juni 2004 - 10:33 #2
Det er beskrevet mange steder bl.a.
  http://www2.csit.fsu.edu/~burkardt/papers/ieee.html
Avatar billede arne_v Ekspert
08. juni 2004 - 10:38 #3
Avatar billede elster Nybegynder
08. juni 2004 - 15:12 #4
Ok, kan se at der er nogle gode beskrivelser af formattet,
så jeg må bare selv implementere en klasse ud fra dette.
Det er desværre ikke til at finde noget kode nogen steder. Tak for hjælpen..
Avatar billede arne_v Ekspert
08. juni 2004 - 16:06 #5
Når man skynder sig selv at tage pointene er det jo nok ikke realistisk
at forvente nogen vil give en stump kode her !!
Avatar billede elster Nybegynder
08. juni 2004 - 16:14 #6
Er gået i gang og næsten færdig med den kode der skal til.
Derfor er spørgsmålet lukket.
Avatar billede arne_v Ekspert
08. juni 2004 - 16:40 #7
Så man:
  - stiller et 200 point spørgsmål
  - lige så snart der er kommet nogle brugbare ideer på bordet så lukker
    man spørgsmålet og tager point selv
  - laver selv en løsning udfra de ideer man har fået gratis
?
Avatar billede elster Nybegynder
08. juni 2004 - 16:56 #8
Jeg havde selv allerede set de der IEEE beskrivelser i forvejen!!! Jeg faldt over RIGTIG RIGTIG MANGE standard beskrivelser i min søgning på internettet efter noget kode - inden jeg stillede spørgsmålet her.. Så dine kommentare hjalp mig altså desværre ikke. Jeg var ude efter noget kode. Hvis jeg ville lave det selv (som jeg nu har gjort) havde jeg sgu ikke bedt om hjælp på eksperten. Og nu har jeg altså selv nået at lave det, inden nogen andre kom med en løsning..
Avatar billede arne_v Ekspert
08. juni 2004 - 18:11 #9
Og det synes du lyder konsistent med spørgsmålets formulering og dit 15:12:12 svar ?
Avatar billede elster Nybegynder
08. juni 2004 - 18:24 #10
Helt ærlig!! 200 point for at sende et link der ikke engang giver løsningen???
Jeg var ligsom godt klar over at man skal udtrække de enkelte bits.. Det kan vel ikke komme som nogen overraskelse for nogen. Metoden som jeg nævnte hedder også: longBitsToDouble(). Jeg var bare flink og ville sige tak for det halve minut du brugte på at sende de links..

Og links er der masser af:
http://www.research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
http://www.psc.edu/general/software/packages/ieee/ieee.html
http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
http://cch.loria.fr/documentation/IEEE754/
http://www.math.utah.edu/~beebe/software/ieee/

Hvis du svarer får du 50 point, fordi du gider at bruge så meget tid på at diskutere sådan noget fis her..!! SLUT
Avatar billede arne_v Ekspert
08. juni 2004 - 18:49 #11
Jeg har vist ikke på noget som helst tidspunkt gjordt krav på 200 point for de links !!

Men der står ikke et ord i dit spørgsmål om at du har fundet ud af hvad format det er.
Og det må være spørgers problem ikke svarers problem at spørgsmålts tekst ikke giver
det korrekte indblik i problem stillingen.

Jeg ville ikke have sagt et ord, hvis du have tilbudt 25 point og givet
175 for noget konkret kode. Og hvis du havde postet din kode før andre
kunne du selv have reclaimet dem.

Jeg ville for den sags skyld heller ikke have sagt et ord, hvis en anden
end dig havde postet koden og han havde fået alle 200.

Og spørgsmålet er lukket så det er ikke teknisk muligt at uddele point igen.

Men jeg er ikke glad for "tag selv point folk" generelt. Og tingene skal gå fair til.
Avatar billede elster Nybegynder
09. juni 2004 - 09:13 #12
Ok, her er koden:

    public static final MinDouble pureLongBitsToMinDouble(long bits) {
        boolean signBit = (bits & 0x8000000000000000L) != 0;

        long fractionBits = (bits & 0x000FFFFFFFFFFFFFL);

        short exponentBits = (short)((bits >> 52) & 0x7FF);
       
        long m;
        int e;
        if (exponentBits == 0) {
            m = signBit ? -fractionBits : fractionBits;
            e = 1 - 1023;
        } else {
            long fullMantissa = fractionBits | 0x0010000000000000L;
            m = signBit ? -fullMantissa : fullMantissa;
            e = exponentBits - 1023;
        }
        // Udfør konvertering:
        MinDouble result = new MinDouble(m).mul(MinDouble.pow(new MinDouble(2), new MinDouble(e - 53 + 1)));
        // Eller ved brug af den normale double type:
        double dResult = m * Math.pow(2, (int)(e - 53 + 1));

        return result;
    }
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