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,4567Exponent: 3
Mantisse: 1,234567Muss 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
-
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)?
-
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; }
-
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.
-
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?
-
Wenn du weißt, dass und du kennst und . Kannst du dann 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,4567Exponent: 3
Mantisse: 1,234567Wie wärs, wenn du das in ein array einliest und dann lediglich das Komma verschiebst?
-
SeppJ schrieb:
Wenn du weißt, dass und du kennst und . Kannst du dann 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 und du kennst und . Kannst du dann 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?