Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Frage zu Binomialkoeffizient
Hallo zusammen,
ich habe hier im Anhang ein (nun) funktionierendes VI, das zum einen die Fakultäten (und daraus den Binomialkoeffizient) mit den LabVIEW-eigenen Funktionen und zum anderen mit einem Progrämmchen meinerseits berechnet.
Meine 3 Whileschleifen funktionieren nur, wenn ich für k und n den Datentyp "Double" verwende. Bei U64 gibt es bei größeren Werten Fehler, auch hier im Bsp. der Lottozahlen (bei kleinen Werten klappt's).
An was liegt das?
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
' schrieb:Meine 3 Whileschleifen funktionieren nur, wenn ich für k und n den Datentyp "Double" verwende. Bei U64 gibt es bei größeren Werten Fehler, auch hier im Bsp. der Lottozahlen (bei kleinen Werten klappt's).
An was liegt das?
Das VI kann ich nicht ankucken. Aber: Sowas liegt immer daran, dass bei Divisionen mit Integer nur Integer herauskommt und dabei Information verloren geht, nämlich der Nachkommaanteil.
Wenn du (n!/k!/(n!-k!)) machst anstelle (n!/(k!*(n!-k!)) kommt bei Integer was anderes heraus. Bei Double sind beide gleich.
Auch (k!*(n!-k!)) für entsprechend große n und k ist bei Integer schlecht. Das Produkt ist größer als MaxInt - was aber nicht zu einem Fehler führt! Hätte das Ergebnis z.B. 65 Bit, wird das 65. einfach ignoriert. (In LV mag das so sein, dass auf MaxInt begrenzt wird).
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
ich habe hier im Anhang ein (nun) funktionierendes VI, das zum einen die Fakultäten (und daraus den Binomialkoeffizient) mit den LabVIEW-eigenen Funktionen und zum anderen mit einem Progrämmchen meinerseits berechnet.
Meine 3 Whileschleifen funktionieren nur, wenn ich für k und n den Datentyp "Double" verwende. Bei U64 gibt es bei größeren Werten Fehler, auch hier im Bsp. der Lottozahlen (bei kleinen Werten klappt's).
An was liegt das?
Bsp.: für Lottozahlen:
[attachment=43783:6a7bd61d...0908c9d3.png]
[attachment=43782:Fakult_t.vi]
Gruß Markus
Überleg Dir mal wieviele Digits in eine 64 Bit Integer Zahl passen! Pro 10 Bits ungefähr 3 Digits, also hört es bei ungefähr 19 Digit langen Zahlen ganz auf. Bei Floating Point Zahlen nimmt die Genauigkeit ab aber Zahlen bis irgendwo so um 10^308 können noch representiert werden.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Frage zu Binomialkoeffizient
Danke für die Infos.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
15.01.2009, 14:46 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2009 14:48 von Lucki.)
Hier kommt noch etwas nachgekleckert.
Bei Gleitommazahlen hast Du bei hohen Zahlen Rundungsbverluste, die man bei Ganzzahlen nicht hat. Es gibt ja das neue Zahlenformat FIX, damit kannst Du ausreichende Bitlänge vorgeben.
Angenommen, es soll bis 50! = 3.04E64 funktionieren Dann muß die Ganzzahl die Bitlänge von 64/log(2) = 210 haben.
Nimm das Format FIX und stelle die Länge auf 256bit, 0 Kommastellen ein.
Die Binomialkoeffizienten sind immer ganzzahlig, also sollte die Forel ohne Rest dividierbar sein. Für die Division sollte die Funktion "Quotient und Rest" verwendet werden, um nicht in das Gleitkommaformat hineinzugeraten. Hoffentlich kann die Funktion mit so langen Fixformatzahlen richtig umgehen.
Habe selbst kein Erfahrungen mit dem FIX-Format, vielleicht kannst Du mal berichten, ob es funktioniert.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Frage zu Binomialkoeffizient
Danke für den Nachtrag, aber irgendwie komme ich mit den FXP-Zahlen nicht zurecht. Wenn ich da bei n oder k was eintrage, wird es sofort auf 0 zurückgesetzt.
Was mich allerdings wundert, ist dass die in LabVIEW enthaltenen VIs mit den U64-Zahlen zurecht kommen. Evtl. wird da intern in DBL umgewandelt.
Gruß Markus
' schrieb:Hier kommt noch etwas nachgekleckert.
Bei Gleitommazahlen hast Du bei hohen Zahlen Rundungsbverluste, die man bei Ganzzahlen nicht hat. Es gibt ja das neue Zahlenformat FIX, damit kannst Du ausreichende Bitlänge vorgeben.
Angenommen, es soll bis 50! = 3.04E64 funktionieren Dann muß die Ganzzahl die Bitlänge von 64/log(2) = 210 haben.
Nimm das Format FIX und stelle die Länge auf 256bit, 0 Kommastellen ein.
Die Binomialkoeffizienten sind immer ganzzahlig, also sollte die Forel ohne Rest dividierbar sein. Für die Division sollte die Funktion "Quotient und Rest" verwendet werden, um nicht in das Gleitkommaformat hineinzugeraten. Hoffentlich kann die Funktion mit so langen Fixformatzahlen richtig umgehen.
Habe selbst kein Erfahrungen mit dem FIX-Format, vielleicht kannst Du mal berichten, ob es funktioniert.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
FIX ist z.B. für kaufmännische Berechnungen. Grundlage dieses Datentyps ist ein I32/I64. In der Anzeige (und der Eingabe) erscheint es so, als sei es eine Double-Zahl mit z.B. vier Nachkommastellen. Dabei wird lediglich die I32/I64-Zahl durch die entsprechende Zehnerpotenz geteilt (=> der Dezimalpunkt um die Anzahl der Nachkommastellen verschoben).
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
15.01.2009, 17:34 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2009 17:35 von jg.)
' schrieb:FIX ist z.B. für kaufmännische Berechnungen. Grundlage dieses Datentyps ist ein I32/I64. In der Anzeige (und der Eingabe) erscheint es so, als sei es eine Double-Zahl mit z.B. vier Nachkommastellen. Dabei wird lediglich die I32/I64-Zahl durch die entsprechende Zehnerpotenz geteilt (=> der Dezimalpunkt um die Anzahl der Nachkommastellen verschoben).
Halt, halt,
hier im Beitrag geistert im Moment so einiges Falsches über das LV-FXP-Format rum.
Somit ist zu bemerken:
1. Eine FXP hat maximal 64bit. (@Lucki: 256 bit geht leider nicht, obwohl es bestimmt interessant wäre).
2. Es wird nicht der Dezimalpunkt verschoben. Es werden immer nur dieselbe Anzahl an Bits für die Nachkommadarstellung genommen. Das bedeutet aber, dass ich nur rationale Brüche, die durch eine Potenz von 2 darstellbar sind (also z.B. 1/2, 1/4, ...) exakt darstellen kann, vorausgesetzt, ich habe genügend Bits für die Nachkommadarstellung reserviert. Bsp: Reserviere ich nur 1 bit für das "Nachkomma", dann kann ich nur Vielfache von 0,5 exakt darstellen.
Dann noch was zum ursprünglichen Thema:
@Y-P: Hast du dir mal die LabVIEW-interne-Implementation des Binominalkoeffizienten angeschaut? Denn alle 3 Fakultäten ausrechnen, da machst du ein wenig zu viel des Guten.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
' schrieb:Es werden immer nur dieselbe Anzahl an Bits für die Nachkommadarstellung genommen. Das bedeutet aber, dass ich nur rationale Brüche, die durch eine Potenz von 2 darstellbar sind (also z.B. 1/2, 1/4, ...) exakt darstellen kann, vorausgesetzt, ich habe genügend Bits für die Nachkommadarstellung reserviert. Bsp: Reserviere ich nur 1 bit für das "Nachkomma", dann kann ich nur Vielfache von 0,5 exakt darstellen.
Da muss ich wohl was falsch verstanden haben.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Frage zu Binomialkoeffizient
Danke für Info, Jens.
Das habe ich auch gesehen. Ich wollte die Fakultäten einzeln berechnen, da ich das jeweilige Ergebnis als Vergleich zu meinen Werten haben wollte.
Gruß Markus
' schrieb:@Y-P: Hast du dir mal die LabVIEW-interne-Implementation des Binominalkoeffizienten angeschaut? Denn alle 3 Fakultäten ausrechnen, da machst du ein wenig zu viel des Guten.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------