Mantisse und Exponent bestimmen
-
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?
-
-
...zur Info: Oder Du nutzt einfach double anstatt float... wie es in einer gewissen Ankündigung auf einer gewissen Seite steht...;)