Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

1

26.06.2004, 20:38

Debug/Release in VC++

Hallo mal wieder,

ich hab' folgende Frage:
werden Fließkommarechnungen/Konvertions anders ausgeführt, wenn das Programm im Debug-Modus kompiliert ist, wie wenn es im Release-Modus kompiliert ist.

Denn bei mir passiert folgendes:

Quellcode

1
2
3
4
float f1, f2;
// f1 und f2 erhalten Werte
f1 = f1 * f2;
sprintf(dummy,"%d",(int)f1);


Im String 'dummy' steht nach DEBUG-Kompilation korrekterweise '1', denn die Berechnungen ergeben das auch (f1 * f2 = 1), doch im ReleaseMode kommt '0' raus! Zwar hat 'f1' definitiv auch den Wert '1.000000...', aber nach dem int-Konvertieren kommt '0' raus, anstatt, wie im DEBUG, '1'.

Nach stundenlangem Forschen (Scheiße, das im RELEASE nicht debuggt werden kann :) ) habe ich herausgefunden, dass wenn 0.0000001 zu 'f1' addiert wird, nach dem Konvertiern doch '1' rauskommt. Also ist anzunehmen, dass 'f1' nicht genau den Wert '1' hat, sondern ein bisschen weniger, ohne optischen Unterschied.
Doch nun die Frage:
Warum ist das im DEBUG-Mode anders? Wird da ungenauer gerechnet?
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

2

26.06.2004, 22:09

Hast du auch f1 und f2 initialisiert?
WENN DIE NACHT AM TIEFSTEN IST DER TAG AM NÄCHSTEN

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

3

27.06.2004, 21:49

Was heißt, initialisiert?
Ich habe ihnen einfach Werte zugewiesen. An den floats an sich wird es nicht liegen, es funktioniert auch, wenn ich die wahren Variablen benutze (es sind in Wirklichkeit Member-Variablen einer Struktur) und die ganze Rechnung implizit (in einer einzigen Rechnung) durchführe.
Anscheinend hat es wirklich was damit zu tun, wie GERECHNET wird im Debug/Release-Mode...
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

4

27.06.2004, 23:15

Also wenn ich das jetzt richtig verstanden habe, hast du den floats Werte in einer Struktur oder Klasse gegeben. Du hast das aber nicht so geschrieben, oder?


struct irgendwas
{
float f1 = 0;
};

ODER

class irgendwas
{
float f1 = 0;
};


das geht nicht, du muss entweder eine Konstrukor haben oder werde wie folgt zuweisen.

irgendwas objekt;

objekt.f1 = 0;

Sonst weiß ich nicht was du meinst...
Erleutere es genauer, oder poste mal den Quellcode...


PS: Gib die floats doch mal ohne sie vorher verwendet bzw. ohne mit ihen gerechnet zu haben zu aus.
WENN DIE NACHT AM TIEFSTEN IST DER TAG AM NÄCHSTEN

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

27.06.2004, 23:21

So schwer ist das doch nicht zu verstehen. Er multipliziert zwei Floats und das Ergebnis ist im Release anders als im Debug.

Ich könnte mir vorstellen, dass der Compiler beim Release den Wert schon im Voraus berechnet. Vielleicht macht er dabei etwas falsch... Es gibt auch eine Option namens "Fließkommakonsistenz verbessern".

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

6

28.06.2004, 21:20

Zitat von »"David Scherfgen"«

Ich könnte mir vorstellen, dass der Compiler beim Release den Wert schon im Voraus berechnet.[\quote]

Was meinst du damit?

Hier mal der Codeausschnitt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
char dummy[1024];
    for(i=0;i<desc.size()-1;i++)
    {
        float f1, f2, f3;
        f1 = (float)GetItem(desc[i])->money;
        f2 = (float)(settings->_start()->b_price);
        f2 /= 100.0f;
        f1 = f1 * f2;
        sprintf(dummy,"%d",(int)f1);
        desc[i] = desc[i] + " (" + dummy + ")";
    }

'desc' ist ein std::vector<std::string>! Die einzelnen Elemente werden des vectors werden später über eine Schleife ausgegeben.
Das witzige ist ja, dass 'f1' am Ende den Wert 1.00000000 hat (wenn ich in sprintf "%f" verwende und nicht in int konvertiere), doch sobald es in int konvertiert wurde, gibt's im Debug-Mode eine 1 und im Release-Mode eine 0!
Und wie gesagt, wenn ich einen winzigen Wert zu 'f1' addiere, funktioniert's auch im Release...
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

7

28.06.2004, 21:23

Ach, noch was, wo gibt's dieses "Fließkommakonsistenz verbessern" (ich hab' VC++ 6.0)
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Werbeanzeige