Probleme bei Umwandlungen von Integer, String nach Float und umgekehrt

soundimpuls!

Cadet 1st Year
Registriert
Okt. 2009
Beiträge
14
Hey,

ich müsste wissen zu welchen Problemen es bei der Umwandlung von:

32bit Float -> 32bit Integer

32bit Float -> String

String -> 32bit Float

String -> 32bit Integer

32bit Integer -> String

32bit Integer -> 32bit Float

kommen kann.

Also ich weiss schon ma dass es bei String nach Float (Integer?) zu Problemen kommen kann, wenn der String aus Buchstaben besteht.
 
Also ganz allgemein hast du immer Genauigkeitsprobleme wenn du von Gleitkommazahlen (Float) in Ganzzahltypen (Integer) konvertierst. Von String in eine Zahl brauchst du geeignete Parser, oftmals im Sprachumfang enthalten. Von Zahl zu String hast du wohl die wenigsten Probleme wenn du z.B. Java oder C# programmierst. da Gibt es implizite Konvertierungen
 
32bit Float -> 32bit Integer => Verlust von Genauigkeit, Integer könnte zu klein für die aufzunehmende Zahl sein

32bit Float -> String => Verlust von Genauigkeit außer du stellst es als Fließkommazahl mit Exponent dar

String -> 32bit Float => Verlust von Genauigkeit außer du stellst die Fließkommazahl mit Exponent dar (erfordert vermutlich dann auch einen eigenen Parser), die Problematik mit den Buchstaben lässt sich lösen durch eigenen Parser oder Vorbereitung des Strings

String -> 32bit Integer => die Problematik mit den Buchstaben lässt sich lösen durch eigenen Parser oder Vorbereitung des Strings

32bit Integer -> String => keine Probleme zu erwarten

32bit Integer -> 32bit Float => Verlust von Genauigkeit bzw. Rundungsproblematik
 
Vielen Dank für die Beantwortung meiner Frage, BerniG und ICH_BIN_LETZTER.
Danke BerniG auch für das explizite Eingehen auf alle Fälle.

Gruss

soundimpuls!
 
BerniG schrieb:
32bit Float -> 32bit Integer => Verlust von Genauigkeit, Integer könnte zu klein für die aufzunehmende Zahl sein

32 Bit sind also kleiner als 32 Bit? :D

BerniG schrieb:
32bit Float -> String => Verlust von Genauigkeit außer du stellst es als Fließkommazahl mit Exponent dar

Die Konvertierung von float in einen String hängt von der Art der Konvertierung ab. Ein String ist nicht definiert, genau wie ein float besteht er aus Bits. Ein String kann aus sehr vielen Bits bestehen, die entweder als ASCII interpretiert werden oder als Unicode. Es hängt also von der Interpretation der Bitfolge ab. Im Prinzip kann ich nämlich auch die Bitfolge als String darstellen, dann habe ich keine Genauigkeit verloren.

In Programmiersprachen existieren feste Konvertierungsmuster, so wird bei der Konvertierung in C von float in int einfach der Nachkommaanteil abgeschnitten. Oder eine Null-Erweiterung durchgeführt, z.B. von unsigned char in unsigned int. Bei der Konvertierung eines ganzzahligen Typs in einen Gleitpunkt-Typ findet eine Umrechnung in die exponentielle Form der Gleitpunktdarstellung statt.

Bevor man also die Probleme der Konvertierung bespricht, muss zunächst geklärt werden welche Form der Konvertierung eigentlich stattfinden soll, z.B. eine Rundung. Hier unterscheiden sich die Vorgehensweisen zwischen den Programmiersprachen. Intern ist letztlich nur der Platz entscheidend. Logischerweise kann ich einen Würfel mit der Kantenlänge 1 m nicht in eine Kiste stecken, die eine Kantenlänge von 1 cm aufweist.

Habe ich ein 32-Bit langen float, dann kann ich die Informationen logischerweise auch in einem 32-Bit int speichern. Allerdings wird eine Gleipunktzahl anders interpretiert, intern mit Exponent und Mantisse. Dadurch kommt es bei einer Deep Copy zwar nicht zu einem Informationsverlust, aber die Interpretation der neuen Ganzzahl ist eine andere.
 
Zuletzt bearbeitet:
32 Bit sind also kleiner als 32 Bit?
Nein das habe ich auch nicht behauptet. Aber 32Bit Float und 32Bit Integer haben unterschiedliche Stärken und Schwächen hinsichtlich ihrer Genauigkeit.
Wie willst du mit einem Integer 3,5 darstellen (=> Genauigkeitsverlust)? Wie willst du mit einem Integer 5.000.000.000 darstellen? Mit float geht das einwandfrei, generell sind hier fast beliebig große Zahlen möglich (wenngleich man meist nicht exakt auf den gewünschten Wert hinkommt und das ist dann im entspr. Wertebereich eben der Vorteil von Integer).

Und wenn du jetzt auf deine folgenden Ausführungen zurückkommst: Wenn du einfach per memcpy oder Ähnlichem deine "Deepcopy" anlegst hast du immer noch eine float im Speicher und keinen Integer. Dass 32Bit 32Bit bleiben ist schon klar aber du betreibst hier Wortklauberei und gehst völlig mit deinen Ausführungen an der Fragestellung vorbei.
 
Zuletzt bearbeitet:
BerniG schrieb:
Nein das habe ich auch nicht behauptet. Aber 32Bit Float und 32Bit Integer haben unterschiedliche Stärken und Schwächen hinsichtlich ihrer Genauigkeit.
Wie willst du mit einem Integer 3,5 darstellen (=> Genauigkeitsverlust)? Wie willst du mit einem Integer 5.000.000.000 darstellen? Mit float geht das einwandfrei, generell sind hier fast beliebig große Zahlen möglich (wenngleich man meist nicht exakt auf den gewünschten Wert hinkommt und das ist dann im entspr. Wertebereich eben der Vorteil von Integer).

Irgendwie komme ich mir gerade blöd vor. Weisst du auch warum? Weil ich Beiträge schreibe und keine Sau liest sich diese durch. Stattdessen wird irgend ein Blödsinn geschrieben.

BerniG schrieb:
Und wenn du jetzt auf deine folgenden Ausführungen zurückkommst: Wenn du einfach per memcpy oder Ähnlichem deine "Deepcopy" anlegst hast du immer noch eine float im Speicher und keinen Integer. Dass 32Bit 32Bit bleiben ist schon klar aber du betreibst hier Wortklauberei und gehst völlig mit deinen Ausführungen an der Fragestellung vorbei.

Falsch! Deine Aussagen waren nicht korrekt. Insbesondere hast du geschrieben das es bei der Konvertierung einer Gleitpunktzahl in einen String zu einem Verlust der Genauigkeit käme, was völliger Unfug ist.

Warum das so ist, habe ich bereits detailliert beschrieben und ich bin nicht hier um mich zu wiederholen, nur weil einige User zu faul sind Beiträge der Mitdiskutanten zu lesen.

Entscheidend ist einzig und allein die Interpretation der Daten und die Form der Konvertierung. Im Speicher gibt es keine Gleitpunktzahl, es gibt nur eine Aneinanderreihung von Bits.

Eine Gleitpunktzahl landet in der Regel in einem Register der FPU. Theoretisch kann Sie aber überall landen, sogar als DWORD, welches ich in ein ST Register schiebe. Es kommt einzig und allein auf die Interpretation der Daten an und wie ich auf diesen operiere. FDIV operiert logischerweise anders auf den Daten als DIV oder wenn ich einen MMX Befehl, wie DIVPD, nehme.

Tatsache ist, bei der Konvertierung einer 32-Bit Float in einen 32-Bit Integer, kommen in Programmiersprachen feste Konvertierungsregeln zu Einsatz, die sich nach der Hierarchie der Datentypen richten. Die Konvertierung beschreibt eindeutig, dass die Nachkommastellen abgeschnitten werden und bei einer zu großen Ganzzahl das Ergebnis nicht definiert ist. Wenn ich also versuche 5.2E20 in einen 32-Bit Integer zu stopfen, so bekomme ich irgendeine undefinierte Ganzzahl heraus die natürlich im Wertebereich des 32-Bit Integers liegt.

Ein String ist aber kein primitiver Datentyp, sondern ein zusammengesetzter Datentyp! Eine Konvertierung von oder zu einem String ist abhängig von der Interpretation und den damit verbundenen Konvertierungsregeln, die ich aufstelle, so wie die Entwickler von C die Vereinbahrung getroffen haben das bei einem gewöhnlichen Cast die Nachkommastellen abgeschnitten werden ohne zu runden.

So kann der String "1625" mit seiner ASCII Repräsentation als 32- Bit Integer gespeichert werden. Der String könnte aber auch als Wert abgespeichert werden, d.h als Ganzzahl. Oder man nehme den String "110010010000111111011011". Ist das nun eine Ganzzahl oder eine Gleitpunktzahl? Ist es eine binäre Darstellung einer Ganzzahl, also die Zahl 13176795, oder ist es die Ganzzahl selbst? Oder ist es eine Gleitpunktzahl mit Mantisse, Vorzeichenbit und Exponent? Richtig, wir wissen es nicht. Wir können den String nur konvertieren, wenn wir das wissen. Es hängt von der Interpretation ab.

Cyba_Mephisto schrieb:

Das dürfte es mit hoher Wahrscheinlichkeit sein. Vor allem wie der Threadersteller die Fragen hingeklatscht hat, ohne selbst dazu Stellung zu nehmen, ganz nach dem Motto, "Macht ihr mal!".
 
Zuletzt bearbeitet:
So, hier werden also die Hausaufgaben von soundimpuls! gemacht.

Aber:
@Stefan_Sch
was ist an folgender Aussage von BerniG so grundsätzlich falsch?
32bit Float -> 32bit Integer => Verlust von Genauigkeit, Integer könnte zu klein für die aufzunehmende Zahl sein

Deine Aussage
32 Bit sind also kleiner als 32 Bit?
ist ja wohl flaming pur, genauso wie dein letzter Post...Sorry.

Ich weiß, dass du dich mit der Materie auskennst, aber geht Kritik/Änderungen/Verbesserungsvorschläge nicht auch ein bisschen freundlicher?
 
Lieber Herr Flamer, wer lesen kann ist wie immer klar im Vorteil. Schau doch mal an was ich bzgl. Strings geschrieben habe und betrachte dabei nicht nur den ersten Halbsatz.

In diesem Forum geht es um Programmieren und nicht theoretische Betrachtungen wie man Float oder Integer anders definieren könnte. Die gängigen Programmiersprachen arbeiten hier nun mal wie beschrieben. Zwar gibt es bei Integern kleinere Unterschiede hinsichtlich der Vorzeichencodierung, darüber hinaus wird in der außeruniversitären Realität aber nichts eingesetzt (Decimals sind wieder ne andere Sache). Und bei Float ist IEEE754 nun mal Standard und nicht irgendwas Selbsterfundenes.
 
BerniG schrieb:
Und bei Float ist IEEE754 nun mal Standard und nicht irgendwas Selbsterfundenes.

Der IEEE 754 Standard ändert an deinen falschen Aussagen rein gar nichts. Satz 2, 3 und 4 bleiben auch jetzt schlichtweg Unfug! Da kannst du nun lamentieren, Nebelkerzen zünden und pöbeln, wie du lustig bist.
 
Zuletzt bearbeitet:
Eine Gleitpunktzahl landet in der Regel in einem Register der FPU. Theoretisch kann Sie aber überall landen, sogar als DWORD

Um dem "Ich zeig dir mal wie dumm du bist"-Spiel noch einen draufzusetzen:
Wenn du schon so genau auf jedes "Wort" eingehst solltest du nicht solltest du nicht aus dem Zusammenhang herausgerissene Begriffe wie "Word oder "DWord" verwenden. Wenn dus schon so genau nimmst, musst du auch berücksichtigen, das die Größe eines Words bzw. DWords per se nicht definiert ist.

:D
 
Richtig. Aber um die Angelegenheit nicht unnötig kompliziert zu machen beschränken wir uns hier einmal auf die IA-32, die direkte Erweiterung der 8086 Architektur. Hier ist die Länge eines Wortes definiert. ;)

Gluehwurm schrieb:
Ich weiß, dass du dich mit der Materie auskennst, aber geht Kritik/Änderungen/Verbesserungsvorschläge nicht auch ein bisschen freundlicher?

Ich war doch nicht unfreundlich. Das manche gleich Unfreundlichkeit aus einer Situation ableiten und dann aggressiv werden, wenn man sie darauf hinweist das ihre Aussage nunmal nicht korrekt war, ist ein bekanntes Phänomen. Man muss es sportlich nehmen, jeder von uns lernt tagtäglich hinzu.
 
Zuletzt bearbeitet:
Na, er ist da definitiv nicht der einzige.
Gehört jetzt nicht zur Fragestellung, aber da die längst geklärt wurde, erachte zumindest ich das jetzt nicht als als so schlimm, es musste einfach mal gesagt werden.
 
Komisch, ich dachte immer, das jede Variable nur ein Anreihung von 0 und 1 sei... Was dann damit gemacht - sprich - wie es interpretiert wird, liegt in der Hand des Entwicklers und dessen Werkzeuge. Leider lies der Threadersteller aus, um welche Programmiersprache es sich handeln könnte, somit denke ich auch nicht, das man wirklich eine exakte Antwort bei dieser - vorsichtig ausgedrückt - recht grob gefassten Frage hätte erhalten können. Da hörte ich mal einen Satz: "Wer behauptet das Problem verstanden zu haben, hat es nicht tief genug betrachtet." (Wenn einer weiß, von wem der Satz stammt, möge sich bitte bei mir melden!)

Etwas abseits vom Thema (aber dennoch aktuell): Interessant ist, das diejenigen, die sich mit einer Materie intensiver befassten, von anderen viel zu vorschnell als "unfreundlich", "unsozial", "Polemiker", "rechthaberisch" und ähnliches dargestellt werden und das, obwohl sie nur die unglaubliche Güte aufbrachten, etwas so Kostbares, wie ihre private Freizeit, in eine Frage und deren Antworten zu "investieren", um auf eine Unstimmigkeit in den Aussagen hinzuweisen. Ja durchaus, der Ton mag hart sein, aber andererseits ist es doch unerheblich, wenn die Aussagen treffend und fachlich schlüssig sind. Ich war, bin und werde jedenfalls dankbar sein, wenn ich mal auf eine fachliche Inkompetenz hingewiesen werde und ein solcher mich vom Gegenteil überzeugt. Also würde ich das Ganze mal etwas entspannter betrachten.

Aber sei es, wie es sei ...

PS: Die Spezialisten sind die, die fette Kohle einfahren, die anderen - naja - was soll ich sagen ... Stefan Sch wird wahrscheinlich zu den ersteren gehören oder bald dazu stossen :)
 
Rossibaer schrieb:
und das, obwohl sie nur die unglaubliche Güte aufbrachten, etwas so Kostbares, wie ihre private Freizeit, in eine Frage und deren Antworten zu "investieren", um auf eine Unstimmigkeit in den Aussagen hinzuweisen.

Keiner zwingt diese Leute dazu hier zu posten. Und wenn dann die Polemik sofort zum Diskussionspunkt wird, sollte man sich mal überlegen, wie sehr so ein, wie du erwähntest, fachlicher Beitrag dazu beiträgt vom Thema abzulenken. Das Ergebnis ist dasselbe, wenn die Verpackung des Geschenks scheiße wäre, könnte man davon absehen, wenn man es am Ende ausgepackt hat, aber das Gefühl der Polemik bleibt ja scheinbar bis zum Ende erhalten.
 
Ich denke das der Einwand von Stefan_Sch berechtigt war. Im übrigen war seine Antwort auf das Thema und dessen bis dahin geschriebenen Antworten bezogen. Wenn jemand sich die Mühe macht, etwas in eine richtige Richtung zu lenken, dann könnte man schon dankbar sein, wenn man will. Also sieh es mal locker und unverkrampft ... Für mich zählt nunmal der Inhalt, nicht die Verpackung. Oder schmeckt das Papier besser, als das Bonbon? Also ich für meinen Teil bevorzuge das Bonbon. Wie sieht es mit dir aus? Wie sieht es mit den restlichen Lesern dieses Threads aus? Bonbon oder Papier...
 
Rossibaer schrieb:
Leider lies der Threadersteller aus, um welche Programmiersprache es sich handeln könnte, somit denke ich auch nicht, das man wirklich eine exakte Antwort bei dieser - vorsichtig ausgedrückt - recht grob gefassten Frage hätte erhalten können.

Das ist in der Tat ein sehr wesentliches Kriterium bei der Beantwortung der genannten Fragen, welches sich naturgemäß aus der Interpretation ableitet. Es existieren zwischen den Programmiersprachen teilweise deutliche Unterschiede, wie implizit und explizit Typen ineinander konvertiert werden.

An dieser Stelle empfiehlt es sich, sich mit der Grundlage der Typkonvertierung vertraut zu machen.

Type conversion

In computer science, type conversion or typecasting refers to changing an entity of one data type into another. This is done to take advantage of certain features of type hierarchies. For instance, values from a more limited set, such as integers, can be stored in a more compact format and later converted to a different format enabling operations not previously possible, such as division with several decimal places' worth of accuracy. In object-oriented programming languages, type conversion allows programs to treat objects of one type as one of their ancestor types to simplify interacting with them.

There are two types of conversion: implicit and explicit. The term for implicit type conversion is coercion. The most common form of explicit type conversion is known as casting. Explicit type conversion can also be achieved with separately defined conversion routines such as an overloaded object constructor.

Each programming language has its own rules on how types can be converted. In general, both objects and fundamental data types can be converted.

http://en.wikipedia.org/wiki/Type_conversion
 
Und da wäre noch etwas im deutschsprachigen Wikipedia:

Implizite Typumwandlungen
Im Unterschied zu expliziten Typumwandlungen erscheinen implizite Typumwandlungen nicht im Quelltext. Sie werden entweder nach durch die jeweilige Programmiersprache vorgegebenen Vorschriften, oder gemäß einem vom Programmierer an einer anderen Stelle im Quelltext festgelegten Verfahren durchgeführt.

http://de.wikipedia.org/w/index.php?title=Typumwandlung
 
Nachdem ich das ganze mit einem Schmunzeln und Kopfschütteln gelesen habe, mal auch noch mein Kommentar:

Stefan_Sch hat einfach eine andere Sichtweise dargelegt. Das diese nicht dem vermutlich gewünschten Ergebnis entspricht, wird ihm wohl genauso klar sein. Trotzdem ist diese Sichtweise nicht falsch - und andere Sichtweisen sind immer eine Bereicherung eines Problems. Sie einfach auszuschließen bzw. nicht als Bereicherung anzusehen bringt einen in diesem Umfeld respektive Job nicht weit.

Also unterscheiden wir doch, um mal die Ursprungsfrage zu betrachten zwischen Repräsentation und Typ. Eine 32-Bit Repräsentation kann immer in eine andere 32-Bit Repräsentation umgewandelt werden. Mehr wollte Stefan_Sch auch nicht deutlich machen.


Um auf das Typ-Problem einzugehen machen wir einfach mal ein paar übliche, praxisnahe Annahmen (die im Ursprungspost fehlen) die als Grundlage für meine weiteren Ausführungen dienen:
- Ein 32-Bit Integer wird binär dargestellt und ist vorzeichenbehaftet (ob nun in Komplementdarstellung, und wenn ja welche, sei mal dahingestellt und ist auch nicht relevant).
- Für einen 32-Bit Float nehmen wir eine IEEE-Repräsentation an. Dabei muss man beachten, dass Mantisse/Exponent speziell umgerechnet werden und der Float zusätzlich NaN (Not A Number), positive und negative Unendlichkeit darstellen kann. Die Darstellung ist ebenfalls binär, sprich zur Basis 2.
- Ein String soll eine Zeichenkette aus meinetwegen ASCII-Zeichen sein, die die Zahl zur Basis 10 (dezimal) darstellen, und kann beliebig lang sein


Um ersteinmal bei der Umwandlung von Repräsentationen zu bleiben. Wandelt man so einen Integer in einen Float um durch Reinterpretierung des Bitmusters, so kann man Zustände erhalten, die in einem Float nicht definiert sind. Solche "kaputten" Floats können übrigens zu Floating Point Exceptions und zum Programmabbruch auf bestimmten Systemen führen, wenn sie als typbehafteter Wert und nichtmehr als Repräsentation betrachtet werden. Genauso gibt es auch definierte Floats, die absichtliche Programmabbrüche hervorrufen können (Signaling NaN z.B.).

Um dann bei der eigentlichen Umwandlung der Werte zu landen (und damit wohl das, was ursprünglich gefragt/gemeint war) die möglichen Problem, die auftreten können (neben einer erfolgreichen Konvertierung):

Int -> Float:
- Verlust von Genauigkeit

Float->Int:
- Verlust von Genauigkeit
- Float garnicht darstellbar in Int (zu groß, positive/negative Unendlichkeit, NaN)

Int -> String:
- problemlos

String -> Int:
- nicht konvertierbar (ungültige Zeichen, Float, ...)
- Wertebereich zu groß

Float -> String:
- (kein Problem): Darstellung von NaN, positiver/negativer Unendlichkeit möglich
- binäre Brüche müssen keine exakte endliche dezimale Darstellung haben. Schneidet man nach x konvertierten Stellen ab, hat man Verlust von Genauigkeit

String -> Float:
- nicht konvertierbar (ungültige Zeichen, ...)
- Wertebereich zu groß
- (kein Problem): Darstellung von NaN, positiver/negativer Unendlichkeit möglich
- dezimale Brüche müssen keine endliche binäre Darstellung haben (Verlust von Genauigkeit)

(ohne Garantie auf Vollständigkeit, sollte aber das meiste abdecken)
 
Zurück
Oben