Subtraktion von Gleitkommazahlen!



  • Hallo!

    Ich sitze jetzt schon ewig vor der Subraktion von Gleitkommazahlen folgendes habe ich:

    Folgende werte habe ich:

    unsigned int value_x, value_y
    unsigned int mantisse_x, mantisse_y;
    value_x = 0x43c80000
    value_y = 0x437a8000
    //Mantissen
    mantisse_x = c80000;
    mantisse_y = fa8000;
    //Exponenten für x = 8 y = 7
    

    So jetzt weis ich das ich die Exponenten angleichen muss damit ich dann subtrahieren kann! Das wäre dann ein Shift von mantisse_y <<1.

    Dann weiß ich dass ich Subtrahieren kann von den zwei mantissen. Und dann soll ich nochmals eine Normierung der Mantisse vornehemen und nochmals eine anpassung des Exponenten aber wie soll ich das machen!

    Bin für jede Hilfe dankbar!!

    mfg



  • Was hast du denn bisher? Wo liegt dein konkretes Problem?



  • Also konkret hab ich net viel!

    Konkret weis ich die Exponenten

    x = 8;
    y = 7;
    

    Und da die Exponenten unterschiedlich sind muss ich die mantisse y um eine stelle nach links shiften das ergibt:

    neu_mantisse = 0x1f50000
    

    Und das ergebniss von der Subtraktione y-x ist 0x12d0000!

    Weiter weis ich leider nicht! Wie ich den rest anstellen soll und auf was ich genau achten muss und ob ich überhaupt richtig bin!

    mfg



  • Erst mal sind deine Mantissen und Exponenten falsch. Denn 0x43C8.0000 = 0x87.9000 * 2^7 und 0x437A.8000 = 0x86.F500 * 2^7.

    Aber gehen wir ruhig von deinen Werten aus. Du shiftest in die falsche Richtung. Denn wenn du den Exponenten um 1 erhöhen willst, musst du die Mantisse mit 2 dividieren. Die multiplizierst aber, um von exp=7 auf exp=8 zu kommen.

    Dann hast du also als neue Mantisse m_y = 0x7D.4000.
    Dann ist m_x - m_y = 0xC8.0000 - 0x7D.4000 = 0x4A.C000
    Da du eine größtmögliche Mantisse mit sechs Stellen anstrebst, musst du jetzt wieder den Exponenten anpassen. Weil floor(0xFF.FFFF / 0x4A.C000) = 3 ist und die nächstkleinere Potenz von 2 eben 2^1 = 2 ist, kannst du den Exponenten um 1 nach unten anpassen und die Mantisse mit 2 multiplizieren. Also erhälst du als Ergebnis:

    mantisse = 0x4A.C000 * 2 = 0x95.8000
    exp = 7

    Kontrolle: 0xC8.0000 * 2^8 - 0xFA.8000 * 2^7 = 0xC800.0000 - 0x7D40.0000 = 0x4AC0.0000 = 0x95.8000 * 2^7



  • Hmmm, danke erstmal
    Könntest das mit floor also Anpassen etwas genauer erklären?

    mfg



  • Du möchtest die Mantisse möglichst nah an die obere Schranke heranführen. Nehmen wir an, die Mantisse sei kleiner als die obere Schranke.

    Dann kannst du dir das Verhältnis zwischen Mantisse und oberer Schranke ansehen, d. h. obere Schranke durch Mantisse. Um die Mantisse zu maximieren, kannst du die Mantisse nur mit Potenzen von 2 multiplizieren. Deshalb musst du dir die größte Potenz von 2 suchen, die kleiner oder gleich dem Verhältnis von Mantisse und oberer Schranke ist.

    Denn wählst du eine kleinere Potenz, so gibt es einen größeren Wert für die Mantisse unterhalb der Schranke, wählst du eine größere Potenz, ist der Wert der Mantisse größer als die Schranke.



  • Hallo,

    Leider muss ich noch mals fragen ich komme einfach nicht hin!!
    Bitte schritt für schritt vorrechenen!
    Meine Wert:

    //Wert
    value_x = 0x43c80000;
    value_y = 0x437a8000;
    //Normierte Mantissen
    x:0xc80000
    y:0xfa8000
    //Exponenten
    exp_x = 0x8;
    exp_y = 0x7;
    //Geshiftet y 
    0x3ea000
    

    Bitte Bitte helft mir nochmals!

    mfg


Log in to reply