Seite 1 von 2

SortStructuredList sortiert Floats falsch. Bug?

Verfasst: 19.09.2006 21:58
von Frogger
Da war ich baff...
Zum ersten Mal war es nötig eine StructuredList nach Floats zu sortieren und dann das.

Hab ich da was falsch gemacht oder ist das ein Bug von PB?

Code: Alles auswählen

Structure test
  a.f
EndStructure

NewList test.test()



AddElement(test())
test()\a = 0.01

AddElement(test())
test()\a = 0.47

AddElement(test())
test()\a = -0.2

AddElement(test())
test()\a = -0.3

AddElement(test())
test()\a = 0.7


SortStructuredList(test(), 0, OffsetOf(test\a.f), #PB_Sort_Float)
Debug "kleine Zahlen zuerst..."
ResetList(test())
While NextElement(test())
  Debug test()\a
Wend
Debug ""

SortStructuredList(test(), 1, OffsetOf(test\a.f), #PB_Sort_Float)
Debug "große Zahlen zuerst..."
ResetList(test())
While NextElement(test())
  Debug test()\a
Wend
Ergebniss:

Code: Alles auswählen

kleine Zahlen zuerst...
0.00999999977648
0.46999999880791
0.69999998807907
-0.20000000298023
-0.30000001192093

große Zahlen zuerst...
-0.30000001192093
-0.20000000298023
0.69999998807907
0.46999999880791
0.00999999977648
Also für mich ist eine negative Zahl immer noch kleiner als eine noch so kleine positive Zahl.

Verfasst: 20.09.2006 07:16
von #NULL
stimmt, er sortiert auf erster ebene nach vorzeichen, und dann die beiden teile für sich nach größe des absolutwertes. ich kann mir auch nicht vorstellen das das so geplant ist. mit double das gleiche.

Verfasst: 20.09.2006 13:50
von Frogger
Das ist echt schade. Gibt es schon eine Procedur, die das richtig macht?
Die Suche hat da auch nicht viel geholfen.

Verfasst: 20.09.2006 14:05
von Kaeru Gaman
das sort prüft wohl nicht den typ.

schaut euch das mal an:

Code: Alles auswählen

Structure test
  StructureUnion 
    a.f
    b.l
  EndStructureUnion 
EndStructure 

NewList test.test() 



AddElement(test()) 
test()\a = 0.01 

AddElement(test()) 
test()\a = 0.47 

AddElement(test()) 
test()\a = -0.2 

AddElement(test()) 
test()\a = -0.3 

AddElement(test()) 
test()\a = 0.7 


SortStructuredList(test(), 0, OffsetOf(test\a.f), #PB_Sort_Float) 
Debug "kleine Zahlen zuerst..." 
ResetList(test()) 
While NextElement(test()) 
  Debug StrF(test()\a) + " - " + Str(test()\b)
Wend 
Debug "" 

SortStructuredList(test(), 1, OffsetOf(test\a.f), #PB_Sort_Float) 
Debug "große Zahlen zuerst..." 
ResetList(test()) 
While NextElement(test()) 
  Debug StrF(test()\a) + " - " + Str(test()\b)
Wend
wenn man jetzt noch bedenkt, dass ein negatives vorzeichen ein gesetztes höchstes bit bedeutet,
dann sieht man, dass die sortierung als "unsigned" eigentlich richtig ist.

Verfasst: 20.09.2006 15:46
von Frogger
Ist ein böser Fehler.
Seltsam, dass es noch niemandem aufgefallen ist.

Wie könnte man so eine Liste sortieren, dass es richtg und zuverlässig funktioniert?

Meine Structure für die LinkedList sieht so aus.

Code: Alles auswählen

Structure Stat
  Spieler.s
  Punkte_Akt.l
  Punkte_Alt.l
  Steigerung.f
  Aktualisierung.s
EndStructure

Verfasst: 20.09.2006 15:54
von Kaeru Gaman
du willst also nach steigerung sortieren? kann die auch negativ sein?

Verfasst: 20.09.2006 16:04
von Frogger
du willst also nach steigerung sortieren? kann die auch negativ sein?
Ja, es ist eigendlich ein Gemisch aus positiven und negativen floats.
Alles Andere funktioniert gut mit SortStructuredList.

Verfasst: 20.09.2006 16:13
von Kaeru Gaman
ne sorry, weiß ich keine abhilfe.

höchstens dir ne eigene sort-routine schreiben aufgrund des quicksort oder eines anderen algos...

Verfasst: 20.09.2006 16:16
von Frogger
Dann bleibt mir wohl nichts anderes übrig. :(

Verfasst: 21.09.2006 17:03
von horst
Frogger hat geschrieben:Dann bleibt mir wohl nichts anderes übrig. :(
Guck mal auf meine Website: QL Sort