[gelöst]Variablentyp für Nachkommastellen/Pi-Berechnung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

[gelöst]Variablentyp für Nachkommastellen/Pi-Berechnung

Beitrag von heheracer »

Hi!
Ich bin grade dabei ein Programm zu schreiben mit dem man Pi ausrechnen kann.
Der Algorithmus ist relativ einfach und der funktioniert auch ganz gut http://de.wikipedia.org/wiki/Vietas_Pro ... eiszahl_Pi.
Aber nach 15 Durchläufen wird die Zahl nicht genauer sondern ungenauer, irgendwann ist es nicht mehr 3,14159 sondern 2,8...
Ich gehe davon aus, dass es an den Nachkommastellen liegt (bei real 15 oder?) und das Programm mit gerundeten Werten rechnet.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  x, n, s: real;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2.Caption:=floattostr(pi);
  progressbar1.step:=10;
  progressbar1.min:=0;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=0;
  n:=1;
  s:=int(strtofloatdef(edit1.text,0));
  if s<1 then
    begin
      s:=1;
      showmessage('Ungültige Eingabe');
    end;
  progressbar1.max:=trunc(s*10);
  repeat
    n:=n+1;
    x:=sqrt(2+x);
    label1.Caption:=floattostr(exp(n*ln(2))*sqrt(2-x));
    progressbar1.stepit;
  until n=s;
  x:=exp(s*ln(2))*sqrt(2-x);
  label1.caption:=floattostr(x);
  showmessage('Fertig');
  progressbar1.Position:=0;
end;
 
end.
 
Im Anhang findet ihr meine Form.

Ein weiteres Problem ist, dass ab 27 Durchläufen 0 angezeigt wird.

MfG
Dateianhänge
Form1
Form1
Form1.png (34.63 KiB) 3136 mal betrachtet
Zuletzt geändert von heheracer am Do 9. Apr 2015, 15:47, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von wp_xyz »

Der Standard-Datentyp mit den meisten gültigen Dezimalstellen ist Extended (19-20 Stellen), nicht Real: http://www.freepascal.org/docs-html/ref/refsu6.html

Wenn das nicht reicht, musst du eine Spezialbibliothek nehmen, wie z.B. http://www.benibela.de/sources_en.html#bigdecimalmath ("Supports at least numbers between 10-19327352814 to 1019327352814 with up to 4831838208 decimal digit precision")

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

Danke! Ich werde es nachher probieren

Mfg

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von Horst_h »

Hallo,

freepascal hat die Unit gmp dabei.Das ist wohl "die" Unit für langzahlberechnungen, die auch mit allen Finessen auf die jeweilige CPU optimiert ist.
Die nutzt die gmp.dll/so von Windows/Linux. Für Windows muss man sie wahrscheinlich ins Verzeichnis des Programmes kopieren.
http://wiki.freepascal.org/gmp
In BCD zu rechnen ist ja nicht der Hit.

Gruß Horst
Mal zur Anschauung der Entwicklung;
https://gmplib.org/pi-with-gmp.html
Über 30% schneller geworden seit Version 4.3 für 3.2 Ghz AMD K10

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

Danke, das klingt sehr vielversprechend, aber aus der wiki seite bin ich nicht ganz schlau geworden. Ich binde die unit gmp in die uses Klausel ein und deklariere die variablen als mpf_t, kopiere die gmp.dll ins Verzeichnis und das war's? Würde dann auch floattostr funktionieren (da ich pi ja auch anzeigen wil)?

MfG

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von Komoluna »

für output siehe hier:
http://wiki.freepascal.org/gmp#String_f ... _functions
eigentlich steht alles auf der wikiseite was du wissen musst.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

Diesen Teil habe ich leider nicht ganz verstanden. Ich hab sowas wie mpftostr erwartet. Was genau ist der/die Befehl/e für eine umwandlung in einen String?

MfG

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von Komoluna »

hast du schonmal mit der Funktion Format gearbeitet?
http://wiki.freepascal.org/Format_function

mp_printf ist eigentlich das gleiche wie writeln(format(...))

ansonsten guck mal hier, da wird es sicher was für direkte stringkonvertierung geben
https://github.com/graemeg/freepascal/t ... p/examples

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

Danke für den Tipp mit dem format, dass habe ich noch nie benutzt und muss ich mir wohl genauer anschauen. Ein nützliches Beispiel habe ich noch nicht gefunden. Leider bringt mir writeln(format(...)) bzw mp_printf(...) nichts da ich den string für ein label brauche.

Mfg

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

Mit Extended konnte ich ungefähr 2 Nachkommastellen genauer bestimmen.
big decimal math wollte ich probieren, allerdings weis ich nicht ganz wie ich .pas dateien in lazarus einbinde :?:
gmp probiere ich morgen

mfg

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von Komoluna »

Komoluna hat geschrieben:ansonsten guck mal hier, da wird es sicher was für direkte stringkonvertierung geben
https://github.com/graemeg/freepascal/t ... p/examples
...

um .pas in dein projekt einzubinden einfach die datei in den projektordner packen und in der uses klauses den dateinamen ohne das .pas einfügen

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

^^ok das einbinden hat geklappt aber bigdecimal haut mit einer fehlermeldung raus das (die wurzel aus 2) keine zahl sei.... ich werd es wohl mit gmp machen

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von heheracer »

ok ich versuche mein bestes was gmp angeht

Code: Alles auswählen

 
var
  x: mpf_t;
  bits, digits: integer; //wofür die auch immer da sind
 
...
 
begin
   ...
   x_set_default_prec(100);
   bits := x_get_default_prec;
    digits := floor(bits * LOG_10_2);
   label1.caption:=format('Sqrt(%d) to %d digits (%d bits) = %s', 2, digits, bits, string(x));
   ...
end;
 
Ich habe nur leider nicht im geringsten Ahnung was da steht, was es bedeutet und ob es richtig ist.

MfG

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von Horst_h »

Hallo,

man muss sich leider die Mühe machen, nachzuschauen, welche Funktionen gmp alle bietet.
https://git.firmos.at/projects/FPC/repo ... rc/gmp.pas
Im ganzen Interface Teil der Unit stehen alle zugänglichen Funktionen und Prozeduren mit minimal Beschreibung.Auch sind operatoren +,-,*,/,** {x hoch y, also auch 2^ X} für viele Typen da.
Du willst Wurzeln berechnen dann braucht es Fliesskommazahlen., also vom Typ MPFloat.
Es sind dann enorm viele Funktionen und Prozeduren, die mit f_ beginnen.

Code: Alles auswählen

{ Return op^(1/2) }
function f_sqrt(var op: MPFloat): MPFloat;
Auch die Umwandlung in einen String ist möglich. Man muss nur lang genug suchen. f_set und f_init , f_get....

Gruß Horst

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

Re: Variablentyp für lange Nachkommastellen (Pi-Berechnung)

Beitrag von indianer-frank »

GMP hat keine Fließkommafunktionen (exp, ln, sin, power, etc.) wie in Deinem Code. Wenn Du sowas brauchst, müßtest Du zB http://www.mpfr.org/ benutzen, welches auf GMP aufbaut; ich kenne aber kein Pascalinterface dazu.

Als Alternative gibt es Pascalroutinen zB in MPArith (http://www.wolfgang-ehrhardt.de/mp_intr ... _functions)

Antworten