Fakultäten berechnen
-
- Beiträge: 24
- Registriert: Mo 5. Nov 2012, 10:51
Fakultäten berechnen
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
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
-
- 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
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
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
-
- Beiträge: 24
- Registriert: Mo 5. Nov 2012, 10:51
Re: Fakultäten berechnen
Also liegt es nicht an mir sondern an Lazarus ?
-
- 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
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.
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
-
- 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
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
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
-
- 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
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.)
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.)
-
- 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
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))
n! = exp(ln(1) + ln(2) + ... + ln(n))
= 10 ^ ( (ln(1) + ln(2) + ... + ln(n))/ ln(10))
-
- 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
Solange man das Ergebnis nie exakt braucht ist das nett.
-Michael
-Michael
-
- 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
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.
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.
-
- 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
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.Patito hat geschrieben:Ansonsten wäre ja der 64-bit-Compiler ein wenig ein Rückschritt.
-Michael
-
- 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
Gut, oder besser gesagt: Schlecht! 64-bit Prozessoren sind bei den Float-Berechnungen also schlechter.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.
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. ?!???
-
- 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
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
@Patito: bei Bedarf kann ich morgen auf unserem Lazarus-Treffen in Stuttgart (Fellbach) was darüber erzählen