Fakultäten berechnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Fakultäten berechnen

Beitrag von SIrRonBird »

Hallo allerseits ,

Ich habe die Aufgabe ein Programm zuschreiben mit dem man Fakultäten berechnen kann.
Ich habe los gelegt und bei mir sind zwei Fehler auf getaucht...

1. Wenn ich die Zahlen ab 20 bis 33 eingebe kommt als Ergebnis eine negative Zahl dann ist definitiv falsch !

2. Ab 34 errechnet er die Zahl 0 !

Wäre schön wenn mir jemand helfen könnte !
Hier ist noch das Programm...

MFG SirRonBird
Dateianhänge
Fakultätenrechnen.rar
(2.23 KiB) 232-mal heruntergeladen

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Fakultäten berechnen

Beitrag von mschnell »

Bei Fakultäten kommst Du schnell über die maximale Größe eines Integer-Type.

in Real rechnen geht zwar, wird aber ab bei größeren Fakultäten ungenau.

Um es "richtig" zu machen brauchst Du "Langzahlen-Arithmetik" (Integers mit größerer Genauigkeit als die Sprache anbietet).
Es gibt diverse "Langzahlen"-Pakete.

-Michael

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Fakultäten berechnen

Beitrag von SIrRonBird »

Also liegt es nicht an mir sondern an Lazarus ?

Linkat
Lazarusforum e. V.
Beiträge: 559
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 3.4 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Fakultäten berechnen

Beitrag von Linkat »

Hallo SlrRonBird,
es liegt nicht an Lazarus sondern an dir. Du musst dir für deine Variablen Typen mit einem Wertebereich aussuchen, die für dein Problem geeignet sind. Bitte informiere dich über den Wertebereich von integer, cardinal, longint und int64. Wenn die immer noch nicht ausreichen, dann musst du (wie mschnell bereits sagte) geeignete Langzahlen-Typen suchen (siehe z.B. gnurz hier im Forum).

Gruß, Linkat

Wie gesagt dies ist nicht ein Problem von Lazarus, sondern von jeder Programmiersprache.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

amrs
Beiträge: 9
Registriert: Fr 12. Okt 2012, 22:55
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: 32Bit

Re: Fakultäten berechnen

Beitrag von amrs »

Hallo SIrRonBird,

wenn Du Fakultäten von z.B. 10.000! berechnen willst, dann habe ich sehr gute Erfahrungen mit der Sprache Icon gemacht (www.cs.arizona.edu/icon). Dort ist ein arithmetisches Langzahlenpaket integriert, das solche Berechnungen möglich macht. Die Sprache ist recht leicht zu lernen.


Beste Grüße

Andreas

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Fakultäten berechnen

Beitrag von mschnell »

Da FPC Operator-Overloading unterstützt, sollte es möglich sein, (wie in Icon) mit solchen Lang-Zahlen (bzw mit beliebig genauen Reals) wie mit normalen numerischen Größen zu rechen, wenn irgendjemand ein passendes Paket zur Verfügung stellt. Keine Ahnung, ob es das bereits gibt....

Ich habe dies gefunden: http://wiki.freepascal.org/gmp aber noch nicht ausprobiert.

-Michael
(Weil es sicherlich viele gut gepflegte und optimierte solche Libraries in C gibt ( http://en.wikipedia.org/wiki/Arbitrary- ... #Libraries ) , würde ich es nicht in Pascal neu implementieren, sondern ein Interface für eine open-Spource C Library bevorzugen. Für die GNU Library gibt es bereits Bindings zu verschiedenen Sprachen. FPC siehe oben.)

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Fakultäten berechnen

Beitrag von Patito »

Praktisch veranlagte Mathematiker verwenden für so eine Aufgabe auch schon mal ganz normale Double-Variablen und die Formel:

n! = exp(ln(1) + ln(2) + ... + ln(n))
= 10 ^ ( (ln(1) + ln(2) + ... + ln(n))/ ln(10))

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Fakultäten berechnen

Beitrag von mschnell »

Solange man das Ergebnis nie exakt braucht ist das nett.

-Michael

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Fakultäten berechnen

Beitrag von Patito »

Ich hab jetzt mal mit 1000000000! herumexperimentiert.

n! = 10 ^ ( log10(1) + log10(2) + ... + log10(n) )
= 10 ^ ( Frac(log10(1) + log10(2) + ... + log10(n)) ) * 10 ^ ( Trunc(log10(1) + log10(2) + ... + log10(n)) )

Anzahl Dezimalstellen: Trunc(log10(1) + log10(2) + ... + log10(n)) + 1
Mantisse: 10 ^ ( Frac(log10(1) + log10(2) + ... + log10(n)) )

Für die Anzahl der Stellen braucht man bei 1000000000 schon ein Int64.

Ich habe mal die Berechnung von 32-bit und 64-bit FPC unter Windows verglichen.
Die 64-bit Float-Berechnungen waren deutlich ungenauer als bei 32-bit.

Gibt es da eigentlich irgendwo einen Standard-Typ mit mehr Präzision als Ersatz?
Ansonsten wäre ja der 64-bit-Compiler ein wenig ein Rückschritt.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Fakultäten berechnen

Beitrag von mschnell »

Patito hat geschrieben:Ansonsten wäre ja der 64-bit-Compiler ein wenig ein Rückschritt.
Soweit ich weiß ist das tatsächlich so. Der genauest REAl Typ beim 32 Bit Compiler hat 80 Bit (inklusive Exponent), beim 64 Bit. Compiler nur 64.

-Michael

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Fakultäten berechnen

Beitrag von Patito »

mschnell hat geschrieben: Soweit ich weiß ist das tatsächlich so. Der genauest REAl Typ beim 32 Bit Compiler hat 80 Bit (inklusive Exponent), beim 64 Bit. Compiler nur 64.
Gut, oder besser gesagt: Schlecht! 64-bit Prozessoren sind bei den Float-Berechnungen also schlechter.
Technologisch hätte ich ja eigentlich erwartet, dass man dann vielleicht einen 128-Bit-Typ anbietet.
Oje. Laut Google/Wikipedia scheinen die Float-Typen bei GPUGPU ja eher noch kürzer zu sein...

Wenn man bessere Präzision braucht muss man das ganze wohl in Zukunft erst mal zu Fuss und ohne
Prozessorunterstützung machen. ?!???

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Fakultäten berechnen

Beitrag von Thomas B. »

Also ich habe sehr gute Erfahrungen mit der freien Gnurz-Bibliothek (GNURZ = Grosse Natürliche Und Rationale Zahlen) gemacht.
@Patito: bei Bedarf kann ich morgen auf unserem Lazarus-Treffen in Stuttgart (Fellbach) was darüber erzählen

Antworten