NaN in Rekrusionen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

TimBo

Betreff: NaN in Rekrusionen

BeitragFr, Okt 29, 2010 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Guden Morche,

kann es sein , dass Blitz3D bei sehr sehr vielen rechnungen irgendwann den Geist aufgibt und selbst bei den einfachsten Floatmultiplikationen einfach NaN hinschreibt ?

Ich habe einen rekrusiven Baum. Jeder Zweig hat eine Wahrscheinlichkeit und einen Wert. Jeder Zweig hat 12 Zweige. Wenn ich jetzt von einem Zweig die Summe aller Produkte aus Wahrscheinlichkeit und Wert haben will, kommt Randomhaft irgendwann NaN. Es ist kein Zufallsgenerator drin, gar nichts. Wenn ich das Programm starte, kommt das NaN immer an unterschiedlicher Stelle.

Gibt es irgendwas, was man bei so rekrusiven Sachen beachten muss?

Lg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

ToeB

BeitragFr, Okt 29, 2010 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht ob dir das weiterhilft, NaN kommt dann wenn z.B. durch 0 Geteilt wird, also nicht machbare mathemathische aufgaben.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Pummelie

BeitragFr, Okt 29, 2010 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist mir bisher noch nie aufgefallen Confused Versuch es mal mit einer anderen Version von BB vlt. hilft das...
It's done when it's done.

TimBo

BeitragFr, Okt 29, 2010 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ich teile nicht durch 0 , sondern mache einfach viele Multiplikationen.


Ich habe die "" Lösung "" auch parat.

Man gehe nicht in den Debugmodus , sondern man compile es und starte die Executable. Dann funktioniert es.


Bin ich doch nicht so bekloppt wie ich angenommen habe Shocked

Lg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

MacroMan

BeitragSa, Dez 04, 2010 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem hatte ich neulich auch... Wink

Irgendwie muss da ein Bug im Debugger sein...

Jamagin

BeitragSa, Dez 04, 2010 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, dem kann ich nur zustimmen!!!
Wenn ich mein Projekt im Debugmodus laufen habe um mir über Debuglog Werte anzuzeigen, hab ich manchmal fehlerhafte Darstellungen am Spielfeld, es wird nicht richtig aktualisiert. Ohne Debug läuft es dann einwandfrei! Ist schon irgendwie komisch. Müßte man MarkSibly einmal fragen!!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

TimBo

BeitragSa, Dez 04, 2010 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
dann bin ich ja nicht der einzige, der diesen Bug hat.
Ist es bei euch in Rekursionen oder auch so? Ich hatte es halt in einer Rekursion festgestellt.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

BIG BUG

BeitragSa, Dez 04, 2010 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Frage ist wie der erste NaN-Wert zustande gekommen ist, denn jede Berechnung welche einen NaN-Wert beinhaltet wird als Ergebnis ebenfalls NaN ausweisen. Daher wird bei einer Rekursion ziemlich schnell ein ganzer Baum "futsch" sein.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

TimBo

BeitragSa, Dez 04, 2010 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ja das ist klar
aber das uncoole ist, dass es immer "random" haft ist. Obwohl es ein Programm ist, dass immer die gleichen Daten erzeugte und erechnet hat.

Deshalb ist es Sinnlos herausfinden zu wollen, was es ausgelöst hast.

Die Rechnungsfolge war immer die gleiche und die Eingabe auch...
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Noobody

BeitragSa, Dez 04, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest ja zum Beispiel mal deinen Code posten, damit wir ein genaueres Bild bekommen, wie der Fehler auftritt und ob er wirklich am Debugger liegt Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

TimBo

BeitragSo, Dez 05, 2010 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ja jetzt kann ich es machen , war für den BWInf:

BlitzBasic: [AUSKLAPPEN]
;[Block]
Local Wuerfel1,Wuerfel2, Augensumme
Dim WuerfelSummenWahrscheinlichkeit#(11)
For Wuerfel1 = 1 To 6 ;Würfel 1 wird "gewürfelt"
For Wuerfel2 = 1 To 6 ;Würfel 2 wird "gewürfelt"
Augensumme=Wuerfel1+Wuerfel2
WuerfelSummenWahrscheinlichkeit#(Augensumme-1)=WuerfelSummenWahrscheinlichkeit#(Augensumme-1)+1
Next
Next

Local i
For i=0 To 11
WuerfelSummenWahrscheinlichkeit#(i)=WuerfelSummenWahrscheinlichkeit#(i)/36
DebugLog WuerfelSummenWahrscheinlichkeit#(i)
Next
;[End Block]

Type FunktionsSpeicher
Field GesPunkte#
End Type

;=========================================================================
Local Window = CreateWindow("Auswertung",0,0,800,600,0,1)
Local timer = CreateTimer(60)

Local TXT_Set = CreateTextField(20,20,100,25,Window)
Local TXT_Wuerfel = CreateTextField(120,20,50,25,Window)

Local BTM_Berechne= CreateButton("Berechne",170,20,100,25,Window)
Local Treeview, TreeViewExists=0

Local EventQuelle

While Not KeyHit(1)
If GetKey() = 27 Then End
Select WaitEvent()
Case $803
End


Case $401
UpdateWindowMenu Window
EventQuelle = EventSource()
Select EventQuelle
Case BTM_Berechne
If TreeViewExists
FreeGadget Treeview
EndIf
Treeview=CreateTreeView(20,50,500,400,Window)
BerechneBestesSet(TextFieldText(TXT_Set),TextFieldText(TXT_Wuerfel),TreeViewRoot(Treeview))
TreeViewExists=True
End Select

End Select

WaitTimer(timer)
Wend

;=========================================================================
Function BerechneBestesSet$(Set$,WuerfelSumme,TreeHandle)
;Diese Funktion berechnet die beste Zugöglichkeit und gibt anschließend das neue Kartenset (ohne die verdeckte Karte) als String aus.
Local tempSet$, tempPWScore#
Local bestSet$, bestPWScore#
Local Wuerfel1,Wuerfel2

Local SubHandle,Variante


;Kann man die WürfelSumme mittels einer Karte darstellen?
If WuerfelSumme<10
If Instr(Set$,Str(WuerfelSumme))<>0 Then
tempSet$=Replace$(Set$,WuerfelSumme,"")

Variante=Variante+1
SubHandle = AddTreeViewNode("Variante "+Variante+") "+tempSet$,TreeHandle)
;Wenn man die WürfelSumme mittels einer Karte darstellen kann, wird mit dem Set ohne die umgedrehte Karte weitergerechnet.
bestPWScore#=BewerteBestSubMove#(tempSet$,SubHandle)
ModifyTreeViewNode SubHandle,"Variante "+Variante+") "+tempSet$+" -> "+bestPWScore#
DebugLog bestPWScore+"yyy"
;Da hier in jedem Fall die erste Stellung analysiert wird, wird das Ergebnis der Simulation stehts als (vorerst) bestes Ergebnis erachtet.
bestSet$=tempSet$
EndIf
EndIf


;Kann man die WuerfelSumme mittels 2 Karten dastellen?
For Wuerfel1=1 To WuerfelSumme
If Instr(Set$,Str(Wuerfel1))<>0 Then
Wuerfel2=WuerfelSumme-Wuerfel1
If Wuerfel2>Wuerfel1 Then
If Instr(Set$,Str(Wuerfel2))<>0 Then
tempSet$=Replace$(Set$ ,Wuerfel1,"")
tempSet$=Replace$(tempSet$,Wuerfel2,"")

;Wenn man die WürfelSumme mittels zwei Karten darstellen kann, wird mit dem Set ohne die zwei umgedrehten Karten weitergerechnet.

DebugLog "///////////////////////////////////////////////////////////////////////////////////"

Variante=Variante+1
SubHandle = AddTreeViewNode("Variante "+Variante+") "+tempSet$,TreeHandle)
tempPWScore#=BewerteBestSubMove#(tempSet$,SubHandle)
ModifyTreeViewNode SubHandle,"Variante "+Variante+") "+tempSet$+" -> "+tempPWScore#
DebugLog tempSet$+": "+tempPWScore#

;Wenn der 'PunkteWahrscheinlichkeitsScore', der bei der Simulation erreicht wurde besser ist, als der 'PunkteWahrscheinlichkeitsScore' von oben (eine Karte umgedreht) wird das Ergebnis (von oben) durch das neue (bessere) ersetzt.
If tempPWScore#>bestPWScore#
bestPWScore#=tempPWScore#
bestSet$=tempSet$
EndIf

EndIf
EndIf
EndIf
Next

Return bestSet$
End Function

Function BewerteBestSubMove#(Set$,TreeHandle)
Local WuerfelSumme
Local Wuerfel1
Local Wuerfel2

Local EinZugMoeglich

Local temp#
Local tempSet$, BestSet$
Local tempPunkte#, BestPunkte#

Local Variante, SubHandle, UnterPunkt

Select Set$
Case ""
ModifyTreeViewNode TreeHandle,"45"
Return 45


Case "1"
ModifyTreeViewNode TreeHandle,"44"
Return 44

Default

Local s.FunktionsSpeicher=New FunktionsSpeicher

For WuerfelSumme=2 To 12
UnterPunkt = AddTreeViewNode (WuerfelSumme+")",TreeHandle)

EinZugMoeglich=0

BestPunkte#=0
tempPunkte#=0
tempSet$=""
Variante =0

;Kann man die WürfelSumme mittels einer Karte darstellen?
If WuerfelSumme<10
If Instr(Set$,Str(WuerfelSumme))<>0 Then
EinZugMoeglich=1
tempSet$=Replace$(Set$,WuerfelSumme,"")


; // Variante 1
Variante=Variante+1
SubHandle = AddTreeViewNode("Variante "+Variante+") ["+tempSet$+"]",UnterPunkt)
BestPunkte# = BewerteBestSubMove#(tempSet$,SubHandle)
ModifyTreeViewNode SubHandle,"Variante "+Variante+") ["+tempSet$+"] "+BestPunkte#

EndIf
EndIf


;Kann man die WuerfelSumme mittels 2 Karten dastellen?
For Wuerfel1=1 To WuerfelSumme
If Instr(Set$,Str(Wuerfel1))<>0 Then
Wuerfel2=WuerfelSumme-Wuerfel1
If Wuerfel2>Wuerfel1 Then
If Instr(Set$,Str(Wuerfel2))<>0 Then
EinZugMoeglich=1
tempSet$=Replace$(Set$ ,Wuerfel1,"")
tempSet$=Replace$(tempSet$,Wuerfel2,"")


; // Variante 2
Variante=Variante+1
SubHandle = AddTreeViewNode("Variante "+Variante+") ["+tempSet$+"]",UnterPunkt)
tempPunkte# = BewerteBestSubMove#(tempSet$,SubHandle)
ModifyTreeViewNode SubHandle,"Variante "+Variante+") ["+tempSet$+"] "+tempPunkte#

If tempPunkte#>BestPunkte#
BestPunkte#=tempPunkte#
EndIf

EndIf
EndIf
EndIf
Next


If EinZugMoeglich=1 Then
s\GesPunkte#=s\GesPunkte#+(WuerfelSummenWahrscheinlichkeit#(WuerfelSumme-1) * BestPunkte#)
ModifyTreeViewNode UnterPunkt,WuerfelSumme+") "+BestPunkte#
Else
s\GesPunkte#=s\GesPunkte#+WuerfelSummenWahrscheinlichkeit#(WuerfelSumme-1) * (SummeUmgedrehteZahlen(Set$))
ModifyTreeViewNode UnterPunkt,WuerfelSumme+") "+SummeUmgedrehteZahlen(Set$)
EndIf


Next


UnterPunkt = AddTreeViewNode (s\GesPunkte#,TreeHandle)

temp#=s\GesPunkte#

Delete s.FunktionsSpeicher

Return temp#

End Select

End Function

Function SummeUmgedrehteZahlen(Set$)
;Diese Funktion berechnet die Summe der nicht im zu bearbeitenden Set vorkommenden (umgedrehten) Kartenwerte.
Local Karte,Summe

For Karte=1 To 9
If Not Instr(Set$,Karte) Then Summe=Summe+Karte
Next

Return Summe
End Function



Eingabe: 1234567 & 3.

mfg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group