[C#] Floatingpoint getallen opslag(IEEE)

Pagina: 1
Acties:

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Hallo,

Ik wil kijken hoe een floating point in het geheugen word opgeslagen. Dit ga ik doen doormiddel van bitwise(Is mij aangeraden).
Ik ben aan het proberen geslagen, maar ik kom er niet uit. Wel is het me al gelukt om te bekijken hoe een gewone integer word opgeslagen.

Dit het ik zo gedaan:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
                SByte Bytes = Convert.ToSByte(this.textBox1.Text);
                String ReturnString = "";
                for (int t = 32; t > 0; t = t / 2)
                {
                    if ((Bytes & t) != 0)
                        ReturnString = ReturnString + "1";
                    if ((Bytes & t) == 0)
                        ReturnString = ReturnString + "0";
                } 


                MessageBox.Show(ReturnString);


Maar nu wilde ik op soortgelijke manier dit doen voor een flaotingpoint getal. Maar er is niets zoals Byte/long/short voor een decimaal getal.

Hoe ga ik dit aanpakken. Zelf had ik al geopperd het zelf geheel te doen, maar dit is te veel werk voor zo'n probleem. En zeker omdat je het exponent moet gaan berekenen wanneer je een 0,xxx getal hebt. Terwijl het toch gewoon in het geheugen staat.

Hoe haal ik dus de 32bits van het IEEE standaard uit het geheugen?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Kijk eens naar de System.BitConverter, en dan met name de functie GetBytes(). Daarmee kun je de byte-representatie van een double terugkrijgen.

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Ok, ik heb mijn code aangepast, ik krijg al wat output die wat zinniger lijkt, maar het klopt nog steeds niet helemaal.

C#:
1
2
3
4
5
6
7
8
9
10
                for (int t = arrayBytes.Length - 1; t > 0 ; t--)
                {
                    Byte Temp = arrayBytes[t];
                    for (int j = 8; j > 0; j = j / 2)
                    {                        
                       //checken -> niet relevant
                    }
                }

                this.textBox1.Text = ReturnString;


Wat doe ik fout dat ik nog steeds rare output krijg.

[ Voor 27% gewijzigd door Depress op 12-04-2007 22:49 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Je display loopje klopt niet. 8 bits zorgen ervoor dat je moet beginnen met 1>>7 om te and'en:
C#:
1
2
3
4
5
6
7
for(int i=0;i<8;i++){
   if((Temp & (1>>i))>0){
      ReturnString += "1"; 
   } else {
     ReturnString +=  "0"; 
   }
}

(bitjes andersom kan natuurlijk ook, dan moet je het loopje maar de andere kant op doen)

Geen idee of er een C# al een functie is om bitwise dingen waar te geven, java heeft dat wel.

Do diamonds shine on the dark side of the moon :?


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Het eerste wat me opvalt: je buitenste for-conditie loopt tot de nul, niet tot en met. Verander het eens naar "t >= 0".

Je binnenste loop klopt helemaal niet :P
Je wilt dat j achtereenvolgens de volgende waarden krijgt: 128, 64, 32, 16, 8, 4, 2, 1, dus:

C#:
1
2
3
4
for(int j = 128; j > 0; j /= 2)  //Of "j = j / 2", of "j = j >> 1", allemaal hetzelfde
{
  //...
}

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Geprobeerd, het werkt nu. Het is echter wel in 64bits maar dat is niet zo erg.

[ Voor 167% gewijzigd door Depress op 09-04-2007 17:34 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

56 bits :? Dan mis je bij ieder byte display loopje een bitje. En een double is natuurlijk 64 bits ;)

[ Voor 23% gewijzigd door voodooless op 09-04-2007 17:33 ]

Do diamonds shine on the dark side of the moon :?


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Dan nog gewoon even los. Wat is dan 32 bits? Een float zeker, maar die is niet echt ondersteund door C# want die zit ook niet in het Convert object.

Verwijderd

Depress schreef op maandag 09 april 2007 @ 17:45:
Dan nog gewoon even los. Wat is dan 32 bits? Een float zeker, maar die is niet echt ondersteund door C# want die zit ook niet in het Convert object.
floats hoef je ook niet expliciet te converten. Daarnaast wordt het gebruik van floats ook sterk afgeraden.

[ Voor 8% gewijzigd door Verwijderd op 09-04-2007 17:48 ]


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 24-11 21:01
Ik gebruik normaal ook double of Decimal. Maar in dit geval was het nodig om floats te gebruiken. Het is niet anders. Daarbij vind ik persoonlijk het bereik van floats ook te klein(Grote wiskundige berekeningen)
Pagina: 1