AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem: Fakultät -> großes Ergebnis

Offene Frage von "mo_greene"
Ein Thema von mo_greene · begonnen am 19. Jul 2008 · letzter Beitrag vom 20. Jul 2008
Antwort Antwort
mo_greene

Registriert seit: 10. Dez 2006
Ort: Berlin
136 Beiträge
 
Turbo Delphi für Win32
 
#1

Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 00:03
Hallo,

ich habe ein kleines Tool programmiert, welches mir die Binomialverteilung zu einem Bernoulli-Experiement berechnet und ausgibt.

Nun mein Problem:

Wenn ich ein Bernoulli Experiment mit der Länge n = 40, p = 0,4 und k = 15 habe, dann muss ich ja um den Binomialkoeffizienten auszurechnen die Fakultät von 40 berechnen lassen. Leider ist dies eine sehr große Zahl, womit Delphi scheinbar Probleme hat, da das Ergebnis nicht stimmt (z.T. negativ oder auch manchmal 0). Das richtige Ergebnis wäre ungefähr 8.16*10^47.

Wie kann ich solch große Zahlen berechnen lassen?


Vielen Dank,

David
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 00:08
Hier im Forum suchenBigInt
Markus Kinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 00:09
Der Typ Integer fasst nur Zahlen bis 2^31 - 1. Du kannst entweder ein Konstrukt nehmen, welches einen größeren Bereich unterstützt oder den Binomialkoeffizienten auf geschicktere Art berechnen. Beispielsweise kannst für 49 über 6 einfach 49*48*47*46*45*44/(2*3*4*5*6) nehmen und erhältst damit keine sehr großen Zwischenergebnisse.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
mo_greene

Registriert seit: 10. Dez 2006
Ort: Berlin
136 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 00:25
Ist ja eine gute Idee, aber wenn ich habe 99 über 97, dann kommt doch für den Zähler des Binomialkoeffizienten auch schonmal etwas sehr großes heraus. Also muss ich dann auf ein von dir so genanntes Konstruk zurückgreifen!?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 02:27
Es würde jedoch noch locker passen, wenn ich nicht irre. Du solltest dir evtl. mal diesen Abschnitt zu Binomialkoeffizienten in der Wikipedia auf der Zunge zergehen lassen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 08:26
Vergiss bitte nicht die normalen Datentypen Double und Extended. Dort wird die Fakultät zwar nicht bis auf die letzte Stelle ausgerechnet, aber die Genauigkeit dürfte dennoch ausreichen, immerhin rechen diese Datentypen auf 15-20 Stellen genau. Das Zwischenergebnis wäre zwar ungenau, aber im Endeffekt dürfte das keine große Rolle spielen.

Weiterhin gibt es für große N auch Näherungsformeln für N! (Sterlingformel, wenn ich mich nicht irre).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#7

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 10:12
Hallo,

Zum Beispiel auf http://www.developia.de/forum/viewto...793&highlight= mein Programm N über k (müßte wohl eher Bernoulli heißen ) berechnet die Werte logarithmisch, weil Multiplikation/Division dann zur Addition/Subtraktion werden und riesige Zahlen verarbeitbar werden.

Gruß Horst
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 11:28
Hatten wir alles schonmal siehe hier http://www.delphipraxis.net/internal...342&highlight=
Folge auch den Links innerhab dieses Postings, dort wurde alles schonmal erklärt und Sourcen gibts auch.
Man sollte erstmal hier in der DP nach zb. "Fakultät" suchen bevor man ständig nach Wikipedia oder extern verlinkt, denn sehr sehr vieles ist in der DP schon gesammelt worden.

Du kannst im Binomial kürzen, so das du mit normalen Integer den Wertebereich stark vergrößerst.

Gruß Hagen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Problem: Fakultät -> großes Ergebnis

  Alt 19. Jul 2008, 16:13
Zitat von negaH:
Man sollte erstmal hier in der DP nach zb. "Fakultät" suchen [...]
Wenn ich mich nicht irre, sollte diese Möglichkeit bereits vom TE ausgeschöpft werden bevor er die Frage stellt
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Problem: Fakultät -> großes Ergebnis

  Alt 20. Jul 2008, 19:12
Zitat von negaH:
Du kannst im Binomial kürzen, so das du mit normalen Integer den Wertebereich stark vergrößerst.
Ja, das geschickte Kürzen ist der Knackpunkt.
Habe da eine gute Implementierung im der Bibliothek ESBMaths von ESBConsult gefunden:
Delphi-Quellcode:
{:
   ESBMaths 3.2.1 - contains useful Mathematical routines for Delphi 4, 5 & 6.
   Copyright ©1997-2001 ESB Consultancy



   ESB Consultancy retains full copyright.



   ESB Consultancy grants users of this code royalty free rights
   to do with this code as they wish.

}

function BinomialCoeff (N, R: LongWord): Extended;
var
   I: Integer;
   K: LongWord;
begin
   if (N = 0) or (R > N) or (N > 1754) then
   begin
      Result := 0.0;
      Exit;
   end;
   Result := 1.0;
   if (R = 0) or (R = N) then
      Exit;
   if R > N div 2 then
      R := N - R;
   K := 2;
   try
      for I := N - R + 1 to N do
      begin
         Result := Result * I;
         if K <= R then
         begin
            Result := Result / K;
            Inc (K);
         end;
      end;
      Result := Int (Result + 0.5);
   except
      Result := -1.0
   end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz