Seite 2 von 5
Re: Probleme mit Doubles
Verfasst: 26.01.2013 01:25
von ts-soft
captain_hesse hat geschrieben:Au man das wird ne Lange Nacht nachträglich EnableExplicit einbauen das bedeutet Arbeit

aber gottseidank haben wir ja Wochenende

.
Da sag ich dann nur: Selber Schuld. Jeder Code sollte immer mit EnableExplicit beginnen, das spart Zeit bei der Fehlersuche,
da viele Fehler gar nicht erst entstehen.
Re: Probleme mit Doubles
Verfasst: 27.01.2013 14:42
von captain_hesse
So ich hab jetzt was gefunden und zwar habe ich, wie es mir empfohlen wurde, die Procedure die wo ich dacht das sie für den Fehler verantwortlich ist in ein eigenes Programm ausgelagert und sie dann mit Daten gefüttert und festgestellt das diese Procedure garkeinen Fehler macht, sie berechnet sowohl bei x86 als auch bei x64 immer daselbe Ergebnis. Das heißt das der Fehler schon vorher passiert, die Daten mit der sie gefüttert wird sind falsch und um das herauszufinden habe ich nun folgendes gemacht, ich habe zuerst mit meinem Programm einen Kreis konstruiert mit ( Xm=10 | Ym=10 ) und Radius 1000 dann habe ich oben an den Kreis eine Tangente gelegt sie hat 1° und die länge 500 und der Berührungspunkt ist gleichzeitig auch der Mittelpunkt der Tangente. Nun habe ich mir die berechneten (x1|y1)=Startpunkt und (x2|y2)=Endpunkt der Tangente angeschaut und habe folgende Ergebnisse bekommen.
Code: Alles auswählen
;x86
x1=-257.414276123
y1=1005.4846191406
x2=242.5095825195
y2=1014.2108154297
;x64
x1=-257.4143302264
y1=1005.4845935471
x2=242.5095173518
y2=1014.2107967657
Bereits ab der 4. Stelle hinter dem Komma weichen die Werte voneinander ab und das ist auch genau das Problem das ich habe, die berechneten Werte müssten doch eigentlich genau gleich sein. Wieso weichen diese werte voneinander ab ? Ich muß noch hinzufügen das die Werte der X64 version die richtigen sind weil damit alles problemlos läuft und die Diskriminante für die PQ-Formel auch den wert 0 hat was sie bei einer Tangenten ja auch haben soll.
Re: Probleme mit Doubles
Verfasst: 27.01.2013 17:23
von mk-soft
Bei float wird intern mit weniger stellen gerechnet.
Siehe
http://de.wikipedia.org/wiki/Gleitkommazahl
Re: Probleme mit Doubles
Verfasst: 27.01.2013 17:48
von DarkDragon

Wird in PB etwa Double automatisch zu Float wenn mit x86 kompiliert wird? Das wäre seltsam.
Re: Probleme mit Doubles
Verfasst: 27.01.2013 18:16
von mk-soft
Stimmt.
Ich erinnere mich no dunkel daran das irgend etwas mit ein Steuerregister zu tun hat.
War glaube ich das bei der Verwendung von 3D danach dieser nicht richtig stand.
P.S. Gefunden...
http://www.purebasic.fr/english/viewtop ... =4&t=44975
Re: Probleme mit Doubles
Verfasst: 27.01.2013 21:09
von captain_hesse
Ich hab mir diesen Thread angeschaut aber meine Englischkenntnisse sind nicht besonders gut und auch mit hilfe des Google übersetzers weis ich nicht ob ich das richtig vestanden habe. Welches Flag muß man denn da setzen und wo ?
Re: Probleme mit Doubles
Verfasst: 27.01.2013 21:22
von STARGÅTE
Kannst du uns mal einen Code zeigen, der diese Ergebnisabweichung reproduziert.
Es gab ja auch schon mal die Diskussion, dass verschiedene Prozessoren verschiedene Werte bei sachen wie 0^0 oder so.
Re: Probleme mit Doubles
Verfasst: 27.01.2013 21:51
von captain_hesse
Ja und ich weiß auch jetzt was es auslöst
Code: Alles auswählen
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0) , 0 , 0 , 800, 600 ,0,0,0,#PB_Screen_NoSynchronization)
Procedure a1()
mx.d=10
my.d=10
radius.d=1000
winkel.d=1
laenge.d=500
x1.d=mx+Cos(Radian(winkel+90))*(radius)
y1.d=my+Sin(Radian(winkel+90))*(radius)
x1a.d=x1-Cos(Radian(winkel))*(laenge/2)
y1a.d=y1-Sin(Radian(winkel))*(laenge/2)
x1b.d=x1+Cos(Radian(winkel))*(laenge/2)
y1b.d=y1+Sin(Radian(winkel))*(laenge/2)
Debug StrD(x1a)
Debug StrD(y1a)
Debug StrD(x1b)
Debug StrD(y1b)
EndProcedure
a1()
Bitte in der X86 version starten, es liegt am WindowedScreen() wenn man diese Zeile als kommentar macht stimmen die Werte. Aber wie kann man das umgehen ?
Re: Probleme mit Doubles
Verfasst: 27.01.2013 22:23
von NicTheQuick
Die Lösung steht doch in dem englischen Thread
Code: Alles auswählen
; At start of program
FPU_ControlWord.w
!fstcw [v_FPU_ControlWord]
t.d = 0
x1.d = t + ParseDate("%yyyy/%mm/%dd %hh:%ii:%ss", "2021/01/01 17:02:01")
InitSprite()
OpenWindow(0, 0, 0, 300, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 300, 200, 0, 0, 0)
; After buggy DirectX function
!fldcw [v_FPU_ControlWord]
u.d = 0
xx1.d = u + ParseDate("%yyyy/%mm/%dd %hh:%ii:%ss", "2021/01/01 17:02:01")
Debug x1
Debug xx1
Am Anfang den Wert 'FPU_ControlWord' lesen und nach dem Screen wieder zurück schreiben.
Hintergrund ist, dass man die Genauigkeit von Floats bzw. Doubles beeinflussen kann. So kann man Geschwindigkeit gewinnen.
Re: Probleme mit Doubles
Verfasst: 27.01.2013 22:24
von captain_hesse
Ok Ich habe es jetzt liegt an meinem schlechten Englisch

das ich nicht gleich kapiert hab was da steht.
Code: Alles auswählen
FPU_ControlWord.w
!fstcw [v_FPU_ControlWord]
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0) , 0 , 0 , 800, 600 ,0,0,0,#PB_Screen_NoSynchronization)
!fldcw [v_FPU_ControlWord]
Procedure a1()
mx.d=10
my.d=10
radius.d=1000
winkel.d=1
laenge.d=500
x1.d=mx+Cos(Radian(winkel+90))*(radius)
y1.d=my+Sin(Radian(winkel+90))*(radius)
x1a.d=x1-Cos(Radian(winkel))*(laenge/2)
y1a.d=y1-Sin(Radian(winkel))*(laenge/2)
x1b.d=x1+Cos(Radian(winkel))*(laenge/2)
y1b.d=y1+Sin(Radian(winkel))*(laenge/2)
Debug StrD(x1a)
Debug StrD(y1a)
Debug StrD(x1b)
Debug StrD(y1b)
EndProcedure
a1()
Ich danke euch allen sehr für eure Hilfe
