Hallo,
ich hatte da ein Problem,
es ist gelöst und wollte mich eigentlich nur ärgern ^^
Also, folgendes:
Ich habe/wollte eine Funktion schreiben bei der Ich ModuloDivision für Doubles „integriere“ und einen 64-bit Integer zurückgibt.+
__int64 DoubleModulo(double x, __int64 y)
{ return (__int64)(y * ((x / y) - floor(x / y))); }
soweit, sogut, doch nach einigen Tests, kam ein Problem zum Vorschein
Ich hatte
x = 9999
y = 100
Als Rückgabewert kam bekam ich dann 98, obwohl es doch eigentlich 99 sein müsste
Dann habe ich die Funktion um einige Debug-Befehle erweitert:
__int64 DoubleModulo(double x, __int64 y)
{ double a = x / y;
double b = floor(x / y);
double c = y * (a - b);
TRACE(„c = %f\n“, c);
TRACE("(int)c = %d\n", (int)c);
ASSERT(c == (int)c);
return (__int64)(y * ((x / y) - floor(x / y))); }
Ausgabe:
c = 99.000000
(int)c = 98
Desweiteren wurde mir mitgeteilt, das die aussage c == (int)c nicht zutreffend sei !
Auf den Fehler bin ich gestoßen, als ich gesehen habe, das der DEBUGGER(Variablen-Ausgabe) gesagt hat, c = 98.999999999999
Ist eher son kleiner Erlebnisbericht, aber eine Frage stellt sich mir, wie kann ich das umgehen ???
Danke für die Hilfe im voraus.
MfG
DDR-RAM