FloatToStrF mit mehr als 18 Stellen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

FloatToStrF mit mehr als 18 Stellen

Beitragvon siro » 26. Nov 2017, 19:37 FloatToStrF mit mehr als 18 Stellen

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 238
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 26. Nov 2017, 21:49 Re: FloatToStrF mit mehr als 18 Stellen

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.
indianer-frank
 
Beiträge: 98
Registriert: 30. Nov 2008, 21:53

Beitragvon siro » 26. Nov 2017, 22:03 Re: FloatToStrF mit mehr als 18 Stellen

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
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 238
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Frank Ranis » 27. Nov 2017, 07:51 Re: FloatToStrF mit mehr als 18 Stellen

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
Frank Ranis
 
Beiträge: 85
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon siro » 27. Nov 2017, 08:21 Re: FloatToStrF mit mehr als 18 Stellen

Ja supi, vielen Dank Frank.
Da ist einiges Brauchbares dabei.
Schaue mir das grade an.
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 238
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Frank Ranis » 27. Nov 2017, 08:31 Re: FloatToStrF mit mehr als 18 Stellen

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
Frank Ranis
 
Beiträge: 85
Registriert: 24. Jan 2013, 21:22
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried