Forum: Compiler & IDEs long array in string array umwandeln


von Alfred (Gast)


Lesenswert?

Mein eigentliches Problem, das mich auf diese Umwandlung führt ist 
folgendes: Ich habe eine Dezimalzahl als Struktur gespeichert mit n 
Stellen.
1
enum sign{POSITVE, NEGATIVE};
2
typedef enum sign Vorzeichen;
3
4
struct dezimalzahl{
5
    Vorzeichen vorzeichen;
6
    long stellen[25];
7
    long posKomma; };
8
typedef struct dezimalzahl Number;

In den Stellen stehen immer nur Zahlen, und posKomma sagt mir wo das 
Komma angezeigt wird bei Ausgabe. Meine Ausgabe lautet nun, 
herauszufinden, ob beispielsweise eine Zahl 4.5874546123154 welche ja 
eigentlich so aussieht:

45874546123154
posKomma = 1
vorzeichen = POSITIVE

in ein double konvertiert werden kann, also ob der Wertebereich 
ausreicht oder nicht. Wenn ja, dann gut, ansonsten Fehler.

Dazu wollte ich mithilfe von Strings machen indem ich zuerst alle Longs 
(Stellen) in geeignete Chars umwandle. Dazwischen füge ich dann das 
Komma als . und dann im zweiten Schritt mittels sscanf das char-Array in 
ein double mit 25 Stellen zu konvertieren.

Also bis jetzt habe ich :
stellen = (4,5,8,7,4,5,4,6,1,2,3,1,5,4)
posKomma = 1

char-Array =  "4.5874546123154"
double = 4.5874546123154

Dann wandle ich das double wieder in ein char-Array um und vergleiche 
alle Stellen mit dem originalen Char-Array. Wenn alle stimmen, dann muss 
die Konvertierung funktioniert haben. Wenn einige abweichen, dann war 
die Zahl zu groß.

Jetzt habe ich aber noch eine Frage: Was passiert eigentlich wenn ich 
schreibe: printf("%.50lf", double_var); wirklich?

Kann meine Methode funktionieren?

von Alfred (Gast)


Lesenswert?

Der Titel sollte eigentlich lauten: "long array in char-Array umwandlen"

von Hans-Peter (Gast)


Lesenswert?

Warum verwendest du einen long (4-8 Bytes) um eine einzelne Ziffer zu 
speichern, wo ein char ausgereicht hätte (1 Byte)?

Außerdem ist dein Algorithmus fürchterlich umständlich. Lies dir mal 
durch wie floats/doubles gespeichert werden:
http://de.wikipedia.org/wiki/IEEE_754
Und überleg dann wie du herausfinden kannst ob deine Zahl so dargestellt 
werden kann. Das wird daraus hinauslaufen, zu prüfen, ob die  Ziffern 
(ohne Komma) in einer Binärzahl mit 52 bits dargestellt werden können 
(und der Rest der Zahl nur 0en wären).

von Alfred (Gast)


Lesenswert?

Die Aufgabenstellung verlangt es von mir mit longs zu arbeiten (ich 
finde es auch einwenig sinnfrei)

Stimmt, denn ein double hat eine Breite von 64 Bit. Das bedeutet wenn 
die Anzahl der Stellen der Zahl * long-Groeße in Bit  kleiner sind als 
64 bit, dann kann man sie konvertieren. Das sollte doch so stimme oder 
nicht?

Jedoch habe ich immer noch ein Problem das long array in eine double 
Variable umzuwandeln. Wie kann ich das ohne Umweg über Strings?

von Hans-Peter (Gast)


Lesenswert?

Alfred schrieb:
> Die Aufgabenstellung verlangt es von mir mit longs zu arbeiten (ich
> finde es auch einwenig sinnfrei)
Urks.
> Stimmt, denn ein double hat eine Breite von 64 Bit. Das bedeutet wenn
> die Anzahl der Stellen der Zahl * long-Groeße in Bit  kleiner sind als
> 64 bit, dann kann man sie konvertieren. Das sollte doch so stimme oder
> nicht?
Nein, ein double hat 52 Bit für die Mantisse (Ziffern) und 11 bit für 
den Exponent (lies den Wiki-Artikel!!). Die Größe eines longs ist zB 32 
oder 64, das heißt aber gar nichts, da du nur die unteren 4 Bits 
verwendest (Ziffern 0-9). Du musst die Zahl ins Binärsystem umwandeln 
und schauen ob der Bereich, in dem 1en vorkommen, max 52bits groß ist.
> Jedoch habe ich immer noch ein Problem das long array in eine double
> Variable umzuwandeln. Wie kann ich das ohne Umweg über Strings?
Dir überlegen wie ein Stellenwertsystem funktioniert. Die Ziffer ganz 
rechts sind die 1er, die Ziffer links davon sind die 10er, die Ziffer 
links davon die 100er, etc. Die musst du nun entsprechend aufaddieren 
und zum schluss mit 2^exponent multiplizieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.