Mantisse und Exponent bestimmen



  • Hallo liebe Programmierer!

    Ich möchte gerne zwei Funktionen erstellen, die mir den Exponenten und die Mantisse einer Dezimalzahl auswerten bzw. berechnen.

    Also float mantisse(float x) und int exponent(float x).

    In dieser Aufgabe soll eine normalisierte Mantisse ausgegeben werden, sprich nur eine Stelle vor dem Komma.

    Beispiel:
    Eingabe: 123,4567

    Exponent: 3
    Mantisse: 1,234567

    Muss ich für die Auswertung der Mantisse die Operatoren >> bzw. << für die Verschiebung des Binärcodes benutzen oder ist das der falsche Ansatz?

    Und wie muss ich bei der Berechnung des Exponenten vorgehen?

    Wäre dankbar für etwas Hilfe 🙂


  • Mod

    Wie wäre es mit einem Logarithmus (für den Exponenten) und einer Division (für die Mantisse, wenn du den Exponenten kennst)?



  • SeppJ schrieb:

    Wie wäre es mit einem Logarithmus (für den Exponenten) und einer Division (für die Mantisse, wenn du den Exponenten kennst)?

    Benötige ich dafür double log10(double x) dekadischer Logarithmus (Basis 10)?


  • Mod

    Wenn du den Tipp verstehen würdest, dann wüsstest du, welcher Logarithmus am besten passt. Da du das anscheinend nicht tust, will ich dich erst mal noch ein bisschen nachdenken lassen. Schließlich sind das deine Hausaufgaben.



  • refeilras schrieb:

    Muss ich für die Auswertung der Mantisse die Operatoren >> bzw. << für die Verschiebung des Binärcodes benutzen oder ist das der falsche Ansatz?

    Entscheidungsfrage mit oder, das ist schlechtes Deutsch.
    Es ist der falsche Ansatz, lerne die C-Standardbibliothek kennen und lasse die die Aufgaben erledigen, im Gegensatz zu dir erledigt sie die Aufgaben immer fehlerfrei:

    int main()
    {
      int exp;
      double man = frexp (123.4567, &exp);
      printf("%d\n%f",exp,man);
      return 0;
    }
    

  • Mod

    Sicher, dass er das möchte? Das war auch mein erster Reflex, als er Mantisse und Exponent gesagt hat, aber das Beispiel 123.4567 = 1.234567 * 10³ spricht doch eher dafür, dass er die Zerlegung im Zehnersystem haben möchte.



  • SeppJ schrieb:

    Sicher, dass er das möchte? Das war auch mein erster Reflex, als er Mantisse und Exponent gesagt hat, aber das Beispiel 123.4567 = 1.234567 * 10³ spricht doch eher dafür, dass er die Zerlegung im Zehnersystem haben möchte.

    Ja richtig. Ich benötige die Zehnerpotenz. Deshalb auch der Gedanke mit dem dekadischen Logarithmus von mir.


  • Mod

    refeilras schrieb:

    Ja richtig. Ich benötige die Zehnerpotenz. Deshalb auch der Gedanke mit dem dekadischen Logarithmus von mir.

    Und zu welchen Ergebnissen/Schlüssen bist du gekommen?



  • Den Logarithmus kann ich ja in der Form berechnen:

    int exponent (float x) 
    
    { int y;
    
        y=log10(x); 
    
        return (y); 
    
    }
    

    Aber reicht das aus um die Mantisse zu bestimmen?


  • Mod

    Wenn du weißt, dass m10e=xm\cdot10^e = x und du kennst xx und ee. Kannst du dann mm berechnen?



  • Möglicherweise eine naive Vorgehensweise: http://ideone.com/HAhiSp

    // change a little, fix a little, let my poor heart break a little ...



  • Danke für den Link!

    Kann mir jemand grob erklären was da alles passiert?

    Danach versuche ich mal das ganze nach meinen Bedürfnissen zu modifizieren.

    #include <stddef.h>
    #include <float.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    double frexp10( double x, int * exp )
    {
        double tmp = .0 > x ? -x : x;
        *exp = 0;
    
        if( tmp >= 10. ) {
    
            *exp = 1;
            for( ; !( ( tmp /= 10. ) < 10. ); ++( *exp ) );
    
        } else if( ! ( tmp > 1. ) ) {
    
            *exp = -1;
            for( ; !( ( tmp *= 10. ) > 1. ); --( *exp) );
        }
    
        return tmp;
    }
    
    int main( void )
    {
        double input = 1234567890;
        double result = .0;
        int exp = 0;
        int i = 0;
    
        for( ; i < 16; input /= 10, ++i ) {
    
            printf( "input = %20lf   ", input );
            result = frexp10( input, &exp );
            printf( "result = %011.10lf x 10^%d\n", result, exp );    
        }
    
        return EXIT_SUCCESS;
    }
    


  • refeilras schrieb:

    Kann mir jemand grob erklären was da alles passiert?

    Was verstehst du denn nicht?

    refeilras schrieb:

    Danach versuche ich mal das ganze nach meinen Bedürfnissen zu modifizieren.

    Warte lieber, bis jemand mit mehr Ahnung über floats vorbeikommt. Ob meine Vergleiche so der renner sind, weiß ich nicht.

    btw: Der eben gepostete Code ist nicht mehr der Endstand.



  • refeilras schrieb:

    Beispiel:
    Eingabe: 123,4567

    Exponent: 3
    Mantisse: 1,234567

    Wie wärs, wenn du das in ein array einliest und dann lediglich das Komma verschiebst?


  • Mod

    SeppJ schrieb:

    Wenn du weißt, dass m10e=xm\cdot10^e = x und du kennst xx und ee. Kannst du dann mm berechnen?

    Leute, habt ihr alle in der Schule die dritte Klasse verschlafen?

    https://ideone.com/uazXEL
    Zeile 13 ist das große Geheimnis. 🙄



  • #include <stddef.h>
    #include <float.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    double frexp10( double x, int * exp )
    {
        double tmp = .0 > x ? -x : x;/*Wenn x goesser 0, dann wird tmp auf -x  und wenn kleiner 0 auf x gesetzt*/
        *exp = 0;
    
        if( tmp >= 10. ) {
    
            *exp = 1;
            for( ; !( ( tmp /= 10. ) < 10. ); ++( *exp ) );/*Was genau wird hier gemacht?*/
    
        } else if( ! ( tmp > 1. ) ) {
    
            *exp = -1;
            for( ; !( ( tmp *= 10. ) > 1. ); --( *exp) );
        }
    
        return tmp;
    }
    
    int main( void )
    {
        double input = 1234567890;/*Wieso funktioniert das nicht wenn ich eine Dezmalzahl eingebe?*/
        double result = .0;
        int exp = 0;
        int i = 0;
    
        for(; i < 16; input /= 10, ++i ) { 
    
            printf( "input = %20lf   ", input );
            result = frexp10( input, &exp );
            printf( "result = %011.10lf x 10^%d\n", result, exp );    
        }
    
        return EXIT_SUCCESS;
    }
    

    EDIT: Sorry SeppJ, ich habe deinen post zu spät gesehen. Deins sieht übersichtlicher aus 🙂



  • SeppJ schrieb:

    Leute, habt ihr alle in der Schule die dritte Klasse verschlafen?

    https://ideone.com/uazXEL
    Zeile 13 ist das große Geheimnis. 🙄

    3. Klasse? Soweit ich mich erinnern kann, kamen Gleichungen erst in der 6. Klasse :p



  • SeppJ schrieb:

    https://ideone.com/uazXEL
    Zeile 13 ist das große Geheimnis. 🙄

    Scheitert aber für negative Ausgangswerte. Aber irgendwas muss der Frager ja für seine Schulaufgaben auch noch selbst machen, das hast du ihm hier sicher noch übrig gelassen.



  • SeppJ schrieb:

    SeppJ schrieb:

    Wenn du weißt, dass m10e=xm\cdot10^e = x und du kennst xx und ee. Kannst du dann mm berechnen?

    Leute, habt ihr alle in der Schule die dritte Klasse verschlafen?

    Ja. Dann post' ich meinen Code eben auf TheDailyWTF 🤡 👍



  • Ich habe das ganze jetzt mit Funktionen.

    #include <stdio.h>
    #include <math.h>
    
    int exponent(float x) {
        int zahl;
    
        zahl= log10(x);
    
        return zahl;
    
    }
    
    float mantisse(float x){
    
        float man;
    
        man = x / pow(10, exponent(x));
    
        return man;
    }
    
    int main()
    {
        float zahl;
        int expo;
        float mant;
    
        printf("Bitte Zahl eingeben:");
        while (scanf("%f", &zahl) == 1)
        {
            expo= exponent(zahl);
            mant=mantisse(zahl);
    
            printf("%f = %.10f * 10^%d\n", zahl, mant, expo);
    
        }
    
        return 0;
    }
    

    Wenn ich hier jetzt z.B. 434.534 eingebe, kommt da 4.345339775 * 10^2 raus. Wie kommt diese Ungenauigkeit zu stande?


Anmelden zum Antworten