Zum Inhalt springen

Stefan_j

Mitglieder
  • Gesamte Inhalte

    10
  • Benutzer seit

  • Letzter Besuch

  1. Danke für die Hilfe! Bin jetzt schon gut im Rennen Was geht: Habe den float in 2 int's eingelesen (ganzzahl und rest) Vorzeichen berechnen Exponenten berechnen binäre (reduzierte & erweiterte) mantisse ausgeben normierte mantisse/denormalisierte mantisse in dezimal und binärwerten ausgeben Das einzige Problem noch: ich bekomm als ascii-code bei ganzzahl 2345 und bei rest 1 raus, das kann nicht ganz richtig sein?? void RNOFloat::toASCII_c(char str[]) { // add your c code of the algorithm here float RNOFloat = value; //Gleitkommazahl, die konvertiert werden soll unsigned int *ptr, bit, maske; int i, exp, vorzeichen; int ganzzahl = abs( static_cast<int>(RNOFloat) ); printf("\nGanzzahl: %d",ganzzahl); printf("\n"); int rest = abs ( static_cast<int>((RNOFloat - ganzzahl) * 100000)); printf("Rest: %d",rest); printf("\n\n"); ptr = (unsigned int*) &RNOFloat; bit = *ptr; maske = 1 << 31; // maske = (unsigned int) 1 << 31; printf("Vorzeichen: "); if (maske & bit){ //maske & bit filtert das Vorzeichen-Bit heraus; Bitweiser Vergleich; 0 positiv; 1 negativ printf("1"); vorzeichen = 1; } else { printf("0"); vorzeichen = 0; } printf("\nExponent: "); exp = 0; //Initialisierung for (i=0; i<8; i++){ //durchlaufe Schleife bis i=8 --> float: Exponent hat 8 Bits; maske >>= 1; exp <<= 1; if (maske & bit){ exp++; } } exp -= 127; //von exp wird der BIAS-Wert von 127 abgezogen printf("%d\n", exp); printf("erweiterte binäre Mantisse: 1."); //1 wird eingefügt, dahinter folgt die reduzierte Mantisse for (i=0; i<23; i++){ //23 Bits für Mantisse reserviert; IEEE754 maske >>= 1; if (maske & bit){ printf("1"); } else { printf("0"); } } //Schritt 1 erledigt: Berechnung Mantisse, Exponent und Vorzeichenbit //Schritt 2: denormalisieren der Mantisse, dies wird im Binärsystem durch shiften erreicht (dezimal: * 2^3) //m = x/2^exp float norm_mantisse = RNOFloat/pow(2.0,exp); printf("\n\nDezimaldarstellung:\nnormierte Mantisse: %f\n", norm_mantisse); //Norm. Mantisse = erw. Mantisse dez./2^23 // --> erw. Mantisse dez. = norm. Mantisse * 2^23 int erw_mantisse = norm_mantisse * pow(2.0,23.0); printf("Erweiterte Mantisse: %d", erw_mantisse); int den_mantisse = erw_mantisse * pow(2.0,3.0); printf("\nDenormalisierte Mantisse: %d\n", den_mantisse); printf("Binaerwert: "); //Berechnung binäre denorm. Mantisse: int int_bit_size = 0; int_bit_size = sizeof(int) * 8; for(i = 0; i < int_bit_size; i++){ printf("%d", (rest & 0x80000000) >> 31); rest <<= 1; } printf("\n"); char c; i = 0; do { str[i++]= ganzzahl % 10 + '0'; cout << str; ganzzahl /= 10; } while (ganzzahl > 0); str[i--] = '\0'; // reverse order for (int x = 0, y = i; x<y; x++, y--) { c = str[x]; str[x] = str[y]; str[y] = c; } //Rest printf("\n"); i=0; do { str[i++]= rest % 10 + '0'; cout << str; rest /= 10; } while (rest > 0); str[i--] = '\0'; // reverse order for (int x = 0, y = i; x<y; x++, y--) { c = str[x]; str[x] = str[y]; str[y] = c; } printf("\n"); } Ist das soweit richtig?
  2. falls das was hilft: So wäre die Lösung für einen Integer-Wert, ich suche die Lösung für einen float-Wert! void RNOInteger::toASCII_c(char str[]) { int int32=value; char c; int i = 0; do { str[i++]=int32 % 10 + '0'; int32 /= 10; } while (int32 > 0); str[i--] = '\0'; // reverse order for (int x = 0, y = i; x<y; x++, y--) { c = str[x]; str[x] = str[y]; str[y] = c; } } Das ist die header-Datei dazu: #ifndef RNOINTEGER_H_ #define RNOINTEGER_H_ #include <iostream> using std::ostream; typedef unsigned int UInt32; class RNOInteger { private: UInt32 value; public: RNOInteger(void); // default constructor RNOInteger(UInt32 val); // constructor to initialize instance with 32-bit integer ~RNOInteger(void); // destructor void toASCII_c(char str[]); // conversion into ASCII in C void toASCII_asm(char str[]); // conversion into ASCII in Assembler friend ostream& operator << (ostream&, const RNOInteger&); }; // Input- and output operators ostream& operator << (ostream& outstr, const RNOInteger& RNOInt); #endif /* RNOINTEGER_H_ */
  3. konkret ist die Aufgabenstellung so: Umwandlung einer 32Bit-Gleitkommazahl (also float) in einen String (ASCII-Zeichen). Es müssen mind. 4 Vorkomma- und 4 Nachkommastellen umgewandelt werden unter Verwendung simpler Bitoperationen wie shift, and, or, subtract. Die C-Version soll dann als Vorlage für denselben Vorgang in Assembler dienen..
  4. das heißt im endeffekt ist nur mehr das MSB in der variable und alle anderen sind 0! gibt es eine Möglichkeit vor jedem bitshift zB mit strcat oder sprintf die bits in eine (andere) variable einzulesen??
  5. Werd das mal ausprobieren! Jedenfalls Danke für die Hilfe!
  6. Naja die Aufgabenstellung ist auf jeden Fall folgende: Die Konvertierung einer Gleitkommazahl zu einem ASCII-String kann mit Hilfe des folgenden Algorithmus berechnet werden: 1. Berechne Mantisse und Exponent der Gleitkommazahl wie im vorherigen Beispiel beschrieben. --> Alles klar 2. Denormalisiere die Zahl, sodass der Exponent 0 ist. Dies erreicht man durch Shiften der Binärzahl. --> auch klar 3. Konvertiere die binäre Zahl vor dem Komma in die dezimale Darstellungsform. Dies kann man durch Addition aller Binärwerte, die mit ihrem Stellenwert 2i multipliziert werden, erreichen, wobei k das höchstwertige Bit (MSB) ist. Danach erhält man den entsprechenden ASCII-Wert durch die Addition mit dem ASCIIWert der Ziffer '0'. --> daher brauche ich die Binärwerte zum weiterrechnen! (jeweiliges Bit * 2 ^exponent) 4. Konvertiere nun auch die binäre Zahl nach dem Komma in die dezimale Darstellungsform. Diese Zahl kann wie folgt berechnet werden: wobei j das niederwertigste Bit (Least Signicant Bit - LSB) darstellt.
  7. das heißt ich habe das Bitmuster am Bildschirm zwar ausgegeben, aber ich kann damit nicht weiter rechnen!!
  8. Ich will eine Gleitkommazahl (Typ float) in einen ASCII String konvertieren! Dazu brauche ich den Wert der Mantisse (und der ist in Binärform)! Ich will das komplette Binärmuster speichern zB (10001101..) Problem: for(i = 0; i < int_bit_size; i++){ printf("%d", (value & 0x80000000) >> 31); value <<= 1; } Wenn ich anschließend value ausgeben will bleibt nur der wert des letzten bits erhalten (also 0 oder 1) brauche aber das ganze Bitmuster!!! printf("%d\n",value); --> = 0 oder 1
  9. hmm.. dazu müsste ich aber vorher wieder alle bits extra ausgeben.. und genau da liegt mein problem diese werte zu speichern!
  10. Hallo! Ich habe folgendes Problem: Ich kann zwar den Binärwert einer Dezimalzahl schön und richtig (durch Bitshifting) am Bildschirm ausgeben: int value = 103179880; int i = 0; int int_bit_size = 32; for(i = 0; i < int_bit_size; i++){ printf("%d", (value & 0x80000000) >> 31); value <<= 1; } aber wie kann ich diesen Binärwert in einer Variable speichern?? Lg Stefan

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...