FloatToStrF mit mehr als 18 Stellen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

FloatToStrF mit mehr als 18 Stellen

Beitrag von siro »

Hallo zusammen,

Ich möchte eine entsprechende Bitposition in einen String wandeln und anzeigen.
Das sollte aber mindestens bis 64 Bits, besser sogar bis 128..256 Bits funktionieren.
Weil spätestens bei Bitpos 2^57 stimmt es nicht mehr.

Also
Bitpos 0 = 1
Bitpos 1 = 2
Bitpos 4 = 16
Bitpos 15 = 32768
Bitpos 57 = 144115188075855872 Lazarus zeigt: 144115188075855870

Code: Alles auswählen

 
 
var BitPos   : Byte;
var BitValue : Double;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  BitPos   := 63;
  BitValue := power(2,BitPos);
  caption  := FloatToStrF(BitValue,ffNumber,1,0);
   //            2^63 = 9223372036854775808
   // Lazarus Ausgabe : 9223372036854775800
   // Differnez = 8
end;             



ich hab grad noch eine Binärwandlung geschrieben, auch hier stoße ich an Grenzen...

Code: Alles auswählen

// !!! geht nur bis 2 hoch 53 ????
// wandelt eien Double Wert in einen Binärstring
// ohne Kommastellen, also nur den Vorkomma Anteil
function DoubleToBin(value:Double):String;
var rest:Double;
begin
  result:='';
  While (value > 0) do begin
    value:=value / 2;
    rest:=Frac(value);
    if (rest) > 0 then result:='1' + result
                  else result:='0' + result;
    value:=value-rest;
  end;
end;       
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: FloatToStrF mit mehr als 18 Stellen

Beitrag von indianer-frank »

Double hat eine 53-Bit Mantisse, d.h. alle integer bis 2^53-1 sind exakt als double darstellbar. Wenn Du mehr willst, gibt es drei Möglichkeiten: Extended bis 2^63-1 (für Win 32-Bit-Programme), UInt64 bis 2^64-1 oder Multiprecision Arithmetik (auch bekannt als a Bignum) wie zB MPArith (hier eine englische Einführung), hier hast Du keine praktischen Beschränkungen.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: FloatToStrF mit mehr als 18 Stellen

Beitrag von siro »

Ich danke Dir erstmal Frank,
ich hab mir das interne Format der Floats noch garnicht angesehen,
aber die 53 Bit Mantisse begrenzt natürlich dir Genauigkeit, das leuchtet mir ein
und spielgelt in etwa meine Ergebnisse wieder.
Das geht also nicht so ohne weiteres, dann benötigt man entsprechende Bibliotheken.
Der Windows Rechner z.B. hat ja auch eine wesentlich höhere Genauigkeit.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: FloatToStrF mit mehr als 18 Stellen

Beitrag von Frank Ranis »

Hallo siro,

siro hat geschrieben:Ich danke Dir erstmal Frank,
ich hab mir das interne Format der Floats noch garnicht angesehen,
aber die 53 Bit Mantisse begrenzt natürlich dir Genauigkeit, das leuchtet mir ein
und spielgelt in etwa meine Ergebnisse wieder.
Das geht also nicht so ohne weiteres, dann benötigt man entsprechende Bibliotheken.
Der Windows Rechner z.B. hat ja auch eine wesentlich höhere Genauigkeit.


schau mal unter

http://delphiforfun.org/programs/Library/bigfloat.htm

eventuell kannst Du da was rausziehen .

Gruß

Frank Ranis
www.flz-vortex.de

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: FloatToStrF mit mehr als 18 Stellen

Beitrag von siro »

Ja supi, vielen Dank Frank.
Da ist einiges Brauchbares dabei.
Schaue mir das grade an.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: FloatToStrF mit mehr als 18 Stellen

Beitrag von Frank Ranis »

Hallo siro,

siro hat geschrieben:Ja supi, vielen Dank Frank.
Da ist einiges Brauchbares dabei.
Schaue mir das grade an.


und für Lazarus/Freepascal schon passend vorgekaut .
Könnte mir nur vorstellen , das die Routinen von der Laufzeit etwas langsamer sind , je nach Anzahl der Stellen hinter dem Komma.

Gruß

Frank
www.flz-vortex.de

Antworten