Berechnung unter 32/64 Bit?
-
Hallo,
in einem Programm erhalte ich auf der zweiten Nachkommastelle unter einem 32 und 64 Bit-System unterschiedliche Ergebnisse. Kann mir bitte jemand erklären warum dass so ist und was ich evtl. dagegen unternehmen kann um immer das gleiche Ergebnis zu bekommen?
Die genutzten Funkionen sehen in etwa so aus:
int Tools::roundToInt(float z){ return (int)(z+0.5); } float ergebnis = (float)Tools::roundToInt(100*wert)/100; // wert ist die berechnete Zahl und vom Typ float.
-
Bitte vollständiges Beispiel, vorzugsweise mit den unterschiedlichen Ausgaben und verwendetem Compiler, dann kann man genau mit dem Finger auf die wichtige Stelle draufzeigen.
Mit dem was du jetzt zeigst, kann ich nur Allgemeinfloskeln als Antwort geben: Die Größe der Datentypen ist nicht Standardisiert. Insbesondere die int-Größe kann zwischen 32- und 64-Bit Systemen unterschiedlich sein. float darf theoretisch auch unterschiedlich genau sein, aber es ist eher ungewöhnlich, dass man in der Praxis so einen Fall antrifft. Eventuell wenn der 64-Bit Code andere Recheneinheiten (z.B. die SSE Einheiten) mit anderer interner Genauigkeit benutzt kann es zu unterschiedlichen Rundungsfehlern kommen.
P.S.: Und magst du mal erläutern was der Code überhaupt machen soll? Das sieht ziemlich ungewöhnlich aus.
-
Also die die 64-Bit-Variante wurde mit dem MinGW-w64 personal 'sezero' build from 2010-10-03 erstellt und die 32-Bit-Variante mit dem MinGW 4.5.2 oder evtl. einer früheren Version, kann ich leider nicht mehr nachvollziehen, aber ggf. noch in Erfahrung bringen, falls es relevant ist.
Was wäre denn ein Vollständiges Beispiel bzw. was sind wichtige Stellen die genauer betrachtet werden müssen um das Problem zu lösen? Das war mehr oder weniger auch nur ein Beispiel, da ich vermutet hatte, dass der Fehler beim Runden entsteht. Das ganze Programm bzw. die DLL daraus kann ich leider hier nicht zur Verfügung stellen. Die DLL führt aber Berechnungen durch und wird in Verschiedenen Programmen verwendet, die in C#, VB und C++ Programmiert sind.
-
Sharpie schrieb:
Was wäre denn ein Vollständiges Beispiel bzw. was sind wichtige Stellen die genauer betrachtet werden müssen um das Problem zu lösen? Das war mehr oder weniger auch nur ein Beispiel, da ich vermutet hatte, dass der Fehler beim Runden entsteht. Das ganze Programm bzw. die DLL daraus kann ich leider hier nicht zur Verfügung stellen. Die DLL führt aber Berechnungen durch und wird in Verschiedenen Programmen verwendet, die in C#, VB und C++ Programmiert sind.
Ich fasse zusammen: Irgendwo passiert irgendwie irgendwas.
-
Und benutz zum Runden besser die Funktionen der Standardbibliothek.
-
Und benutz zum Runden besser die Funktionen der Standardbibliothek.
sehr gut, das war tatsächlich der Fehler, mit den Funktionen aus der Standardbibliothek läuft alles perfekt!
vielen Dank an alle für die Hilfe!