Das Zuweisen eines doppelten Werts, der in Variable A gespeichert wird, zu einer Variablen B ändert seinen Wert, sobald der Wert unter 0,000001 fällt. Ich habe über Probleme mit 80-Bit-FPUs gelesen, aber in diesem Fall sollte dieses Problem nicht auftreten, da ich nur einen Wert zuweise, ohne etwas damit zu berechnen. Hier einige Stück Beispielcode:Doppelte Zuweisung ändert Wert
double elapsed = _sinceCreation.elapsed();
if (benchmark->minTime > elapsed) {
benchmark->minTime = elapsed;
}
benchmark->minTime
_sinceCreation.elapsed()
sollte gleich, aber es funktioniert nicht überraschend! Was könnte der Grund dafür sein? Und wie kann ich dieses Verhalten beheben?
EDIT:
meine Erklärung abzuschließen, hier ist das Verfahren, bei dem es seltsam (inklusive Testausgang Gleichheit zu überprüfen) verhält:
double elapsed = _sinceCreation.elapsed();
if (_benchmarkMap.find(benchmark->methodName) == _benchmarkMap.end()) {
_benchmarkMap[benchmark->methodName] = benchmark;
}
if (benchmark->times.size() >= _benchmarkLimitPerMethod ||
benchmark->times.size() >= benchmark->times.max_size()) {
benchmark->times.pop_front();
benchmark->maxSizeReached = true;
}
benchmark->times.push_back(elapsed);
if (benchmark->minTime > elapsed) {
std::cout << printToString("before min time: {0:0.15f} elapsed: {0:0.15f}", benchmark->minTime, elapsed) << std::endl;
benchmark->minTime = elapsed;
std::cout << printToString("after min time: {0:0.15f} elapsed: {0:0.15f}", benchmark->minTime, elapsed) << std::endl;
}
if (benchmark->maxTime < elapsed)
benchmark->maxTime = elapsed;
_sinceCreation
ist eine Zeitstempel-Klasse, Rückkehr Doppel Sekunden seit letzten setCurrentTime()
und printToString()
ist ein eigener Wrapper für fmtlib.
Bitte geben Sie eine [mcve] –
Sie hat nicht gezeigt, wie Sie festgestellt haben, dass die Werte nicht gleich sind. – PaulMcKenzie
https://stackoverflow.com/questions/17333/what-is-the-most-effective-way-for-float-and-double-comparison –