![]() |
String --> Single Single-->String
Hallo ich habe habe folgendes Problem.
Ich arbeite mit dem Datentyp Single (einfache Genauigkeit nach IEEE) Nun möchte ich Konvertierungen vom Typ String ( beispielsweise beim Auslesen eines Single Wertes aus einer INI-Datei) in den Typ Single wandeln, mache es zurzeit mit der Funktion StrToFloat:
Delphi-Quellcode:
doch hier habe ich das Problem, dass Ungenauigkeiten entstehen, da der Rückgabetyp von StrToFloat höher auflöst (Extended) als
function StrToFloat(const S: string): Extended; overload;
der Datentyp Single... Hoffe ihr versteht meine Problematik. Danke euch |
Re: String --> Single Single-->String
Max doch einfach eine Hex-Repraesentation des Single.
Delphi-Quellcode:
Ich glaube die umgekehrte Konversion kriegst du alleine hin.
type
THexSingle = record case Boolean of False: (Value: Single;); True: (Hex: array [0..SizeOf(Single)-1] of Byte;); end; var Conv: THexSingle; S: string; I: Integer; begin Conv.Value := 7.326; S := ''; for I := Low(Conv.Hex) to High(Conv.Hex) do S := S + Format('%.2x', [Conv.Hex[I]]); end; |
Re: String --> Single Single-->String
Hi!!
Würde gerne eine Funktion haben, die mir Bsp.: '1,2345678' als Single speichert Gibt es keine Delphi Funktion die mir aus einem String den entsprechenden Single zurückgibt (nicht als Extended)? |
Re: String --> Single Single-->String
:gruebel:
Und einfach die Extended runden geht nicht!? (Genauigkeit wegrunden: Weichzeichner für Zahlen :mrgreen: ) |
Re: String --> Single Single-->String
Gibt es denn einen zwingenden Grund, mit Single zu arbeiten? Ich habe hier zufällig gerade ein Projekt vorliegen wo ebendies zu groben Darstellungsungenauigkeiten führt (was allerdings auch teilweise auf "unelegante" Handhabung zurückzuführen ist...) :)
|
Re: String --> Single Single-->String
Wie meinst du das mit wegrunden?
Nunja ich habe folgende Stringdarstellung einer Single Zahl: '1,2345678' daraus ergibt sich 1,2345677844578 oder so ähnlich |
Re: String --> Single Single-->String
@OldGrumpy:
Ja der Datentyp Single ist hier zwingend erforderlich, da eine Kommunikation mit einem uController besteht und der auf Single-Basis rechnet. Deswegen kann ich nicht höher gehen als der uC kann... |
Re: String --> Single Single-->String
Da hab ichs ja richtig gut, hier rechnet die Software alles in grosse Integers um die dann an den µC gehen :)
|
Re: String --> Single Single-->String
Zitat:
naja das mit dem Runden hab ich grade getestet und so einfach mit roundto(x,-7) geht's doch nicht :( |
Re: String --> Single Single-->String
Bei einer Konvertierung von String nach Single nach String wird in den seltensten Fällen wieder das Original herauskommen, da Single nur sieben bis acht Stellen speichern kann. Es kann bei reellen Zahlen nur eine sehr beschränkte Teilmenge des Zahlenvorrats abgebildet werden und das führt dann eben zu Rundungsproblemen.
|
Re: String --> Single Single-->String
Wenn Du dem spanischen ein wenig mächtig bist ->
![]() Oder ein wenig einfacher:
Delphi-Quellcode:
Grüße
function StrToSingle(St : String) : Single;
var Code : Integer; begin Val(St,Result,Code); end; Klaus |
Re: String --> Single Single-->String
Zitat:
macht aus '1,2345678' eine 1 und aus '1.2345678' eine 1,2345677614212 edit: Wo ist nur Hagen (oder einer der andern Mathe/Zahlenprofi's) wenn man ihn mal brauch!? :mrgreen: |
Re: String --> Single Single-->String
Könnte es sein, dass 1,2345678 als 1,2345677614212 gespeichert wird? Denn bekanntlicherweise sind float werte sowiso nur Nährerungswerte, und ungenau ...
Wenn es dir nur darum geht, eine kurze Zahl im String zu haben, kannst du sie ja auch mit 10000000 multiplizieren und runden ;) |
Re: String --> Single Single-->String
Warum verfolgst du meine Idee nicht weiter? Einfach die binaere Repraesentation des Single in einen Hex-String verwandeln und wieder zurueck. Dabei geht kein Bit verloren.
Bei der Konversion von der binaeren Repraesentation ins Dezimalsystem ergeben sich zwingend Ungenauigkeiten. Jede Zahlendarstellung mit endlicher Stellenanzahl umfasst nur eine endliche Menge von Zahlen. Entsprechend gibt es im Zahlenraum viele Luecken. Bei verschiedenen Zahlendarstellungen (binaer, dezimal) sitzen die Luecken an unterschiedlichen Stellen. Bei der Umwandlung werden daher zwingend Zahlen die in eine Luecke fallen wuerden auf die naechstliegende Zahl geaendert. |
Re: String --> Single Single-->String
@Robert
Hi, ich glaube das mit der Hexdarstellung werde ich so machen oder so ähnlich, aber mein Problem liegt ausserdem noch hier: Benutzer gibt einen Fliesskommawert (Koeffizienten einer Polynomberechnung) ein in ein Textfeld, diesen Wert muss ich als Single Wert abspeichern, d.h. von String nach Single, jedoch kann Delphi, doch nur StrToFloat mit Extended. Könnte ihr mir da irgendwie weiterhelfen??? Gruß DelphiManiac |
Re: String --> Single Single-->String
-- war nix, Frage missverstanden --
Klaus |
Re: String --> Single Single-->String
Na hier greift einfach die Zuweisung. Mit der Ungenauigkeit muss man leben.
|
Re: String --> Single Single-->String
@Robert
Hi, was meinst du mit :
Delphi-Quellcode:
Danke Dir!
Na hier greift einfach die Zuweisung. Mit der Ungenauigkeit muss man leben.
|
Re: String --> Single Single-->String
Könntet ihr mir eventuell erklären,
was der Paramter Precision (Genauigkeit) bei FloatToStrF genau macht? Angenommen ich habe einen Singlewert: 0.00000000000000123456789? Gracias Community |
Re: String --> Single Single-->String
Zitat:
Zitat:
|
Re: String --> Single Single-->String
Kannst du mir definieren,
was mit signifikanten Stellen gemeint ist? Sind es die Stellen hinter dem Komma. Ein Single besteht ja aus Exponent, Mantisse und Vorzeichenbits. [i]Fundamentale reelle Typen in Win32 Typ Bereich Signifikante Stellen Größe in Byte Single -1,5 x 10^45 .. 3,4 x 10^38 Signifikante Stellen 7-8 Bytes: 4 |
Re: String --> Single Single-->String
|
Re: String --> Single Single-->String
Danke Klaus,
hätte ich ja auch selber drauf kommen können (schliesslich ist bei mir Wikipedia fast dauernd offen) :lol: Das heißt eigentlich ab dem ersten auftreten einer Zahl ungleich Null beginnen die "Signifikanten Stellen"? richtig? Das würde aber bedeuten, das folgende Zahl doch mit dem Datentyp Single gespeichert werden kann, oder: 0.000000000000001234567 -> 1,234567*10^-15 ________________^^^^^^^ ________________1. _________________2. __________________3. ___________________4. ____________________5. _____________________6. ______________________7. Signifikante Stelle und das bedeutet -1,5 x 10^45 .. 3,4 x 10^38 heißt, dass der Exponent (bzw das Komma) bis 3,4 x 10^38 sitzen kann und -1,5 x 10^45, aber nur 7-8 Stellen wirklich signifikant sind? Richtig? :idea: |
Re: String --> Single Single-->String
@alzaimar
... ist klar im Vorteil, ja jetzt habe ich den IEEE754 Aufbau des Datentyps Single verstande, ist ja ein wenig abstrakter als normale Dezimalstellen, deswegen mein nachfragen. Also danke euch Leute... Gruß DelphiManiac |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz