
#include "ENumber.au3"

; Beispiel 01:
; ##################################
; Chance 1.000.000 6en hintereinander zu würfeln
Local $pow1e6 = (1/6)^1e6
ConsoleWrite('Double: 1Mio 6en  = ' & $pow1e6 & @CRLF) ; Das wird nichts. Das ist eine solide 0

Local $pow1e6_ = _EN_Pow(1/6, 1e6) ; in der anderen Schreibweise kein Problem.
Debug($pow1e6_, 'eine Million 6en ')
Debug(_EN_Root($pow1e6_, 1e6), 'millionste Wurzel') ; hier komme auch wieder die 1/6 heraus, wenn man die Millionste Wurzel zieht.
; ##################################


; Beispiel 02: Lotto
; ##################################
 ; Lotto Spielen: 13 983 816 Möglichkeiten
Debug(Binomial(49, 6), ' 6 aus  49:') ; Easy

; Weltraumlotto mit 60 aus 490.
; Würde man via double Genauigkeit rechnen müsste man die Formel umstellen.
; Das Ergebnis wäre mit 7.2e77 zwar als double darstellbar, die Zwischenschritte
; sind aber z.B. Fakultät(490) = 1e1107.136 und damit zu groß für double.
Debug(Binomial(490, 60), '60 aus 490:')
; ##################################

Func Fakultaet($x) ; x! (nicht ausgereifte Methode, daher nicht in UDF, nur als Beispiel)
	Local $fac = 1
	For $i = 1 To $x Step 1
		$fac = _EN_Mul($fac, $i)
	Next
	Return $fac
EndFunc

Func Binomial($n, $k) ; Auch nur ein Beispiel, das lässt sich optimieren.
	Return _EN_Div(Fakultaet($n), _EN_Mul(Fakultaet($n - $k), Fakultaet($k)))
EndFunc

Func Debug($x, $s = 'x', $r = Null)
	ConsoleWrite($s & ' = ' & _EN_ToString($x) & ' (Double: ' & _EN_ToDouble($x) & ')' & ($r = Null ? '' : ('[' & $r & ']')) & @CRLF)
EndFunc   ;==>Debug
