Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dual darstellung nach IEEE 754 Gleitkomma

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.06.2007, 16:17 Uhr
~Hammy
Gast


Habe die suche zwar schon bemüht aber leider nix passendes gefunden.

Habe folgendes Problem;
Zahlen von Dezimal nach Dual umwandeln. <- dabei brauche ich keine hilfe
aber das ganze soll als Folge von 32 bit im einfachgenauen Gleitpunktformat
nach IEEE 754 dargestellt werden.

Kann mir jemand das mal kurz mit normalen Worten erklären?
Ich weiß das das erste bit das vorzeichen darstellt aber mehr
auch nicht wirklich.






ja ihr habt recht, ich habe die vorlesung geschwänzt und hoffe nun auf eure
hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.06.2007, 16:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


http://de.wikipedia.org/wiki/Mantisse
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.06.2007, 16:50 Uhr
0xdeadbeef
Gott
(Operator)


Besser nachlesbar hier: http://de.wikipedia.org/wiki/IEEE_754

Etwa in der Mitte des Artikels gibts ne schön anschauliche Grafik, das Ding in rot/gelb/grün.

Der Exponent wird stumpf normal wie eine binäre Ganzzahl aufgeschrieben, die Mantissenbits von links nach rechts als Zweierpotenzen mit negativem Exponenten - also erstes bit 1/2, zweites 1/4, drittes 1/8 und so weiter. Der Wert des ganzen ist dann vorzeichen * mantisse * 2^exponent.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.06.2007, 17:25 Uhr
~Hammy
Gast


ahh, das hilft schon mehr

Allerdings verstehe ich das mit der umrechnung noch nicht so ganz.

Der Aufbau
Vorzeichen 1bit
Exponent 8bit
Mantisse 23bit

Aber der exponent wird irgendwie von 127 abgezogen?
und wie speicher ich die Zahl 1.1?
muß ich das komma jetzt noch verschieben? 0.11?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.06.2007, 18:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Vereinfacht gesagt: Damit du nach links und nach rechts shiften kannst musst du das ja irgendwie auf die exponenten abbilden. Daher führt man einen offset ein und "interpretiert" dann den Exponent entsprechend.


Mit folgendem COde kannst du ja mal ein bisschen rumspielen und versuchen das nachzubasteln...

C++:
#include <iostream>

template <class T>
void binaer_ausgeben(T zahl){
    void *x=&zahl;
    for(int i=sizeof(T);--i+1;std::cout<<' ')
        for(int j=8;--j+1;)
            std::cout<<(int)(( *( ((unsigned char*)x)+i )>>j)&1);
    std::cout<<std::endl;
}

int main(){
float x=4515.863;
double y=4711.0815;

binaer_ausgeben(x);
binaer_ausgeben(y);

}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.06.2007, 19:51 Uhr
~Hammy
Gast


Ich will das ja nicht per C ausrechnen lassen sondern werde
das evtl. morgen in der Klausur machen müssen. Also auf Papier.
Weiß der Geier wozu ein Maschinenbauer sowas braucht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.06.2007, 20:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ich will das ja nicht per C ausrechnen lassen sondern werde
das evtl. morgen in der Klausur machen müssen. Also auf Papier.


Das war ja nur als Hilfe gedacht um selber zu rechnen und zu gucken, ob man es richtig macht. So kann man sich ja ganz schnell zahlen durchrechnen lassen und gucken was rauskommen müsste...


Zitat:

Weiß der Geier wozu ein Maschinenbauer sowas braucht.


Das ist ja wohl mal essentielles Basiswissen eines jeden Ingenieurs. Bin sogar nur Wiing und kein Vollblutsing und kann das auch... Es gibt so ein paar Sachen die sollte man wissen. Das gehört imho dazu... Das gehört auch in den "Stundenplan" eines Maschinenbauers und ist da nicht fehl am Platze...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.06.2007, 22:35 Uhr
0xdeadbeef
Gott
(Operator)


Mal zur Verdeutlichung:

C++:
#include <stdint.h>
#include <stdio.h>
#include <float.h>

void print_float(float f) {
  int i, j;
  char const *p = (char const *) &f;

  for(i = sizeof(float) - 1; i >= 0; --i) {
    for(j = 7; j >= 0; --j) {
      printf("%d", p[i] >> j & 1);
    }
    putchar(' ');
  }
  putchar('\n');
}

int vorzeichen(float f) {
  char const *p = (char const *) &f;

  return p[sizeof(float) - 1] >> 7 & 1;
}

int8_t exponent(float f) {
#define EXPONENT_BIAS (FLT_MAX_EXP - 1)

  unsigned char const *p;
  int8_t c;

  p = (unsigned char const *) &f;
  c = (int8_t)(((p[sizeof(float) - 1] & '\x7f') << 1) |
           ((p[sizeof(float) - 2] & '\x80') >> 7)) - EXPONENT_BIAS;

  return c;

#undef EXPONENT_BIAS
}

float mantisse(float f) {
  int32_t *p = (int32_t*) &f;
  int32_t x = *p;
  int i;
  float result = 1.0;

  for(i = 0; i < FLT_MANT_DIG - 1; ++i) {
    result += ((x << (33 - FLT_MANT_DIG)) >> (31 - i) & 1) * (1.0 / (2 << i));
  }

  return result;
}

int main(void) {
  float f = 1500.0;

  print_float(f);
  printf("%d\n", exponent(f));
  printf("%d\n", vorzeichen(f));
  printf("%lf\n", mantisse(f));

  printf("%lf\n", (vorzeichen(f) ? -1.0 : 1.0) * (1 << exponent(f)) * mantisse(f));

  return 0;
}


Auseinandergenommen und wieder zusammengesetzt. Das Vorzeichen ist einfach das erste Bit, die Mantisse halt, wie gesagt, Zweierpotenzen mit negativem Exponenten - also 1/2, 1/4, 1/8 und so weiter. Bemerkenswert ist lediglich der Exponent, der als unsigned int mit 8 bit verstanden wird, von dem aber dann der exponent bias abgezogen wird (Das ist 2^(exponentenbits - 1) - 1, also in diesem Fall 2^7 - 1 = 127), und dass auf die Mantisse noch 1.0 draufgerechnet wird, damit die Rechnung vorzeichen * 2^exponent * mantisse auch funktioniert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 25.06.2007 um 22:39 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: