0 Daumen
749 Aufrufe

Hilfe! Ich suche einen Informatikgott, der oder die mir mit meinen Code hilft!

Gleitpunktzahl als IEEE darstellen mit Vorzeichen, Exponent und Mantisse.

Man soll die Zahl -1.1 z.B. eingeben und rauskommen soll.

Vorzeichen: 1

Exponent: 01111111

Mantisse: 00011001100110011001101

Mein Code sieht bisher so aus. Ich weiss nur nicht wie man richtig dimensioniert.

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main(void){

      float fgo;

      unsigned int ix;

      int*pia = NULL, i;


      printf("gib Gleitpunktzahl ein: ");

      scanf("%d", &fgo);

      rewind(stdin);

      pia = &fgo;

      ix = *pia;

      for (i = 31; i >= 0; i--) {

            printf("%d", ((ix >> 1) & 1));

      }

      getchar();

      return(0);

}

Ich bedanke mich schonmal herzlich im Voraus!

Da ich die Lösung dringend bis morgen brauche, möcht ich mich gerne mit Pralinen bedanken für eine Antwort.

Avatar von

1 Antwort

+1 Daumen

Hallo Nama,

Da ich die Lösung dringend bis morgen brauche, möcht ich mich gerne mit Pralinen bedanken für eine Antwort.

Ok - die Pralinen kann ich mir nicht mehr verdienen; aber ich antworte trotzdem: Du schreibst in der Überschrift, dass Du das Programm in C++ machen sollst. Dein Code ist aber reinstes C! Aus dem Define '_CRT_SECURE_NO_WARNINGS' (obwohl hier völlig unnötig!) schließe ich, dass Du das Visual Studio von Microsoft benutzt, welches C++-fähig ist. Der Define hat auch nur unter C++ überhaupt Wirkung!

Deshalb hier eine C++-Lösung Deiner Aufgabe:

#include <cstdint> // std::uint32_t
#include <iostream> // cout, endl

std::ostream& print_bits(std::ostream& out, std::uint32_t x, int von, int bis)
{
    for(int iBit =bis; iBit >= von; --iBit)
    {
        out << ((x >> iBit) & 1);
    }
    return out;
}
int main()
{
    using namespace std;
    static_assert(sizeof(float) == 4, "das Programm setzt einen Typ 'float' mit 32 Bit voraus");

    for (float fgo; cout << "> ", cin >> fgo; )
    {
        uint32_t* pia = reinterpret_cast<uint32_t*>(&fgo);
        uint32_t ix = *pia;
        print_bits(cout << "Vorzeichen: ", ix, 31, 31) << endl;
        print_bits(cout << "Exponent: ", ix, 23, 30) << endl;
        print_bits(cout << "Mantisse: ", ix, 0, 22) << endl;
    }
    return 0;
}


meine Ausgabe ist dann:

> -1.1
Vorzeichen: 1
Exponent: 01111111
Mantisse: 00011001100110011001101
> 1.1
Vorzeichen: 0
Exponent: 01111111
Mantisse: 00011001100110011001101
> -2.2
Vorzeichen: 1
Exponent: 10000000
Mantisse: 00011001100110011001101
>

Wenn man \(1.1\) statt \(-1.1\) eingibt, so ändert sich nur das Vorzeichen und verdoppelt man den Wert zu \(-2.2\), so ändert sich der Exponent um 1. Siehe auch IEEE 754.

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community