Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String --> Single Single-->String (https://www.delphipraxis.net/90478-string-single-single-string.html)

DelphiManiac 18. Apr 2007 08:41


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:
 function StrToFloat(const S: string): Extended; overload;
doch hier habe ich das Problem, dass Ungenauigkeiten entstehen, da der Rückgabetyp von StrToFloat höher auflöst (Extended) als
der Datentyp Single...


Hoffe ihr versteht meine Problematik.

Danke euch

Robert Marquardt 18. Apr 2007 08:50

Re: String --> Single Single-->String
 
Max doch einfach eine Hex-Repraesentation des Single.
Delphi-Quellcode:
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;
Ich glaube die umgekehrte Konversion kriegst du alleine hin.

DelphiManiac 18. Apr 2007 08:54

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)?

TeronG 18. Apr 2007 09:15

Re: String --> Single Single-->String
 
:gruebel:
Und einfach die Extended runden geht nicht!? (Genauigkeit wegrunden: Weichzeichner für Zahlen :mrgreen: )

OldGrumpy 18. Apr 2007 09:18

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...) :)

DelphiManiac 18. Apr 2007 09:19

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

DelphiManiac 18. Apr 2007 09:21

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...

OldGrumpy 18. Apr 2007 09:24

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 :)

TeronG 18. Apr 2007 09:28

Re: String --> Single Single-->String
 
Zitat:

Zitat von DelphiManiac
Nunja ich habe folgende Stringdarstellung einer Single Zahl:

'1,2345678'

daraus ergibt sich

1,2345677844578 oder so ähnlich

Schon komischer ... wenn ich mich mit den Zahlentypen besser auskennen würde währs bestimmt logisch ^^
naja das mit dem Runden hab ich grade getestet und so einfach mit roundto(x,-7) geht's doch nicht :(

DelphiKlaus 18. Apr 2007 09:39

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.

Klaus01 18. Apr 2007 09:47

Re: String --> Single Single-->String
 
Wenn Du dem spanischen ein wenig mächtig bist -> http://www.clubdelphi.com/foros/showthread.php?t=30929
Oder ein wenig einfacher:

Delphi-Quellcode:
function StrToSingle(St : String) : Single;
var
 Code : Integer;
begin
     Val(St,Result,Code);
end;
Grüße
Klaus

TeronG 18. Apr 2007 09:59

Re: String --> Single Single-->String
 
Zitat:

Zitat von Klaus01
Delphi-Quellcode:
function StrToSingle(St : String) : Single;
var
 Code : Integer;
begin
     Val(St,Result,Code);
end;

:gruebel:
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:

jfheins 18. Apr 2007 10:05

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 ;)

Robert Marquardt 18. Apr 2007 10:12

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.

DelphiManiac 3. Mai 2007 08:32

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

Klaus01 3. Mai 2007 08:50

Re: String --> Single Single-->String
 
-- war nix, Frage missverstanden --
Klaus

Robert Marquardt 3. Mai 2007 09:09

Re: String --> Single Single-->String
 
Na hier greift einfach die Zuweisung. Mit der Ungenauigkeit muss man leben.

DelphiManiac 3. Mai 2007 09:50

Re: String --> Single Single-->String
 
@Robert


Hi, was meinst du mit :

Delphi-Quellcode:
Na hier greift einfach die Zuweisung. Mit der Ungenauigkeit muss man leben.
Danke Dir!

DelphiManiac 3. Mai 2007 10:25

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

alzaimar 3. Mai 2007 11:05

Re: String --> Single Single-->String
 
Zitat:

Zitat von DelphiManiac
Angenommen ich habe einen Singlewert: 0.00000000000000123456789?

Es gibt keinen solchen Single-Wert. Die haben nämlich nur 7-8 signifikante Stellen.
Zitat:

Zitat von Die Delphi-Hilfe
The Precision parameter specifies the precision of the given value. It should be 7 or less for values of type Single, 15 or less for values of type Double, and 18 or less for values of type Extended.
The Digits and Format parameters together control how the value is formatted into a string. For details, see the description of TFloatFormat.

Wer lesen kann...

DelphiManiac 3. Mai 2007 11:13

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

Klaus01 3. Mai 2007 11:21

Re: String --> Single Single-->String
 
0.00000000000000123456789 -> 1,234567*10^-15

Signifikante Stellen

Grüße
Klaus

DelphiManiac 3. Mai 2007 11:31

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:

DelphiManiac 3. Mai 2007 13:31

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