Hallo zusammen
Ich arbeite z.Z an einem etwas größeren Projekt und zwar an einem Zeichenprogramm und habe folgendes Problem,
das Programm besteht zu ca. 95% aus Double Variablen und wenn ich es nun mit der 64 Bit Version von PB starte, sind alle Berechnungen die das Programm macht korrekt aber wenn ich es mit der 32 Bit Version starte bekomme ich teilweise andere bzw. falsche Ergebnisse zurück. Sollten die Doubles in beiden PB Versionen nicht exakt das selbe ergebnis liefern ?
Mir ist auch aufgefallen das dieses Problem nicht von anfang an war sondern erst als das Programm größer wurde und eine größere Anzahl an Doubles erreicht wurde.
Mein Arbeitssystem steht unten in der Signatur.
Viele Grüße
Armin
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
Entweder falsche strukturen oder falsche procedurerückgabetypen, die dies bewirken.
Oder Du castest irgendwo auf ein Integer statt auf einem Quad.
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.
Daran ist nichts falsch, jedenfalls hat diese Strukture keine Schuld. Aber um Dir helfen zu können, bräuchten wir schon
die Proceduren, die für das falsche Ergebnis verantwortlich sind. Welche das sind wirst Du wohl selber rausfinden können.
Alle Proceduren nacheinander in x64 und x32 aufrufen und sehen, welche Schuld hat und hier posten.
Ich hoffe mal, Du warst so klever und hast globale Variablen vermieden, ansonsten wird es schon etwas schwieriger.
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.
Was TS-Soft meint ist:
Du könntest irgendwo ein Ergebnis einer Double als Integer speichern, wobei die Zahl für Integer (wenn es eine Long ist) zu klein ist, dann würdest du beim wieder Umwandeln ein falsches Ergebnis bekommen, hier bei Beispiel:
Double.d = 123.456e9
Debug Double
Integer = Int(Double/10) ; << Hier wurde vergessen es als Quad zu definieren
Double = Integer * 10
Debug Double ; Unter 32Bit falsch
64Bit hat geschrieben:123456000000.0
123456000000.0
32Bit hat geschrieben:123456000000.0
-5393018880.0
>> Nicht ganz ein par globale sind schon drin und auch die structuren sind global. Was bewirken diese denn ?
Die bewirken, das wir deren richtigen Wert nicht unbedingt beurteilen können, da diese von allen Seiten verändert sein
könnten. Kommt halt drauf an, für was Du die eingesetzt hast, ob das sich jetzt erschwerend auswirkt.
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.
ts-soft hat geschrieben:Die bewirken, das wir deren richtigen Wert nicht unbedingt beurteilen können, da diese von allen Seiten verändert sein
könnten. Kommt halt drauf an, für was Du die eingesetzt hast, ob das sich jetzt erschwerend auswirkt.
Das kann ich ausschließen, die globalen Variablen haben so gut wie nichts mit den Fehlberechnungen zu tun es sind nur einige wenige das ist überschaubar.
Es könnte aber möglich sein wie STARGÅTE geschrieben hat das ich irgendwo ein .d vergessen hab und einen Double Wert in eine long rein quetsche da der fehler ja nur in der 32 bit version vorkommt. Ich muß da nochmal drüber schauen ob ich was finden kann und melde mich dann wieder. Bis dahin aber schonmal vielen Dank euch beiden
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)
captain_hesse hat geschrieben:das ich irgendwo ein .d vergessen hab und einen Double Wert in eine long rein quetsche
Wenn Du EnableExplicit nutzt, sollte dies eigentlich kaum möglich sein
Einfach die Proceduren in einen leeren Source kopieren und dann mit 32 und 64 bit die Ergebnisse prüfen, dann
solltest Du den Schuldigen schon finden
Zum testen möglichst hohe Werte (> Long) verwenden.
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.
ts-soft hat geschrieben:Wenn Du EnableExplicit nutzt, sollte dies eigentlich kaum möglich sein
Einfach die Proceduren in einen leeren Source kopieren und dann mit 32 und 64 bit die Ergebnisse prüfen, dann
solltest Du den Schuldigen schon finden
Zum testen möglichst hohe Werte (> Long) verwenden.
Ok werd ich so machen.
Au man das wird ne Lange Nacht nachträglich EnableExplicit einbauen das bedeutet Arbeit aber gottseidank haben wir ja Wochenende .
Windows 7 Ultimate 64 Bit / AMD Phenom II 1090T, 6x3200 MHz / AMD HD-6850 / PureBasic 5.1 (x86) (x64)