LabVIEWForum.de
Frage zu Binomialkoeffizient - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Frage zu Binomialkoeffizient (/Thread-Frage-zu-Binomialkoeffizient)

Seiten: 1 2


Frage zu Binomialkoeffizient - Y-P - 15.01.2009 09:00

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?

Binomialkoeffizient:
[attachment=16142]

Bsp.: für Lottozahlen:
[attachment=16143]

[attachment=16144]
Lv85_img

Gruß Markus


Frage zu Binomialkoeffizient - IchSelbst - 15.01.2009 09:17

' 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).


Frage zu Binomialkoeffizient - rolfk - 15.01.2009 09:17

' schrieb: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?

Binomialkoeffizient:
[attachment=43779:5b1910ee...41ebbf44.png]

Bsp.: für Lottozahlen:
[attachment=43783:6a7bd61d...0908c9d3.png]

[attachment=43782:Fakult_t.vi]
Lv85_img

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.

Rolf Kalbermatter


Frage zu Binomialkoeffizient - Y-P - 15.01.2009 09:32

Danke für die Infos. Top2

Gruß Markus


Frage zu Binomialkoeffizient - Lucki - 15.01.2009 14:46

' schrieb:Danke für die Infos.
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.


Frage zu Binomialkoeffizient - Y-P - 15.01.2009 14:54

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.



Frage zu Binomialkoeffizient - IchSelbst - 15.01.2009 15:31

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).


Frage zu Binomialkoeffizient - jg - 15.01.2009 17:34

' 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.

Schaut mal hier:
http://zone.ni.com/reference/en-XX/help/37...data/#Using_FXP

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.
[attachment=16157]

Gruß, Jens


Frage zu Binomialkoeffizient - IchSelbst - 15.01.2009 18:17

' 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.
Hmm

Da muss ich wohl was falsch verstanden haben.


Frage zu Binomialkoeffizient - Y-P - 16.01.2009 07:08

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.