Probleme mit Doubles

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Probleme mit Doubles

Beitrag von ts-soft »

captain_hesse hat geschrieben:Au man das wird ne Lange Nacht nachträglich EnableExplicit einbauen das bedeutet Arbeit :freak: 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag 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.
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Probleme mit Doubles

Beitrag von mk-soft »

Bei float wird intern mit weniger stellen gerechnet.

Siehe http://de.wikipedia.org/wiki/Gleitkommazahl
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Probleme mit Doubles

Beitrag von DarkDragon »

mk-soft hat geschrieben:Bei float wird intern mit weniger stellen gerechnet.

Siehe http://de.wikipedia.org/wiki/Gleitkommazahl
:? Wird in PB etwa Double automatisch zu Float wenn mit x86 kompiliert wird? Das wäre seltsam.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Probleme mit Doubles

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag 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 ?
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Probleme mit Doubles

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag 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 ?
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Probleme mit Doubles

Beitrag 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.
Benutzeravatar
captain_hesse
Beiträge: 138
Registriert: 17.05.2009 18:55
Computerausstattung: Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Wohnort: Saarland

Re: Probleme mit Doubles

Beitrag von captain_hesse »

Ok Ich habe es jetzt liegt an meinem schlechten Englisch :oops: 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 :allright:
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Antworten