Unterschied Ich verwende Eigen C++ Bibliothek für lineare Algebra-Operationen.Eigen `sum()` Funktion gibt für denselben Vektor in zwei Versionen des Programms
Es gibt eine Variable v
in meinem Code, der ein VectorXd
Typ ist, und ich muss seine Summe berechnen, so rief ich v.sum()
.
Allerdings, wenn ich mein Programm auf eine neue Version aktualisiert, obwohl der Wert von v
gleich bleiben (aus der gleichen Eingabedatei lesen), die sum()
Funktion leicht anderen Wert geben.
hier ein Stück Code, das mein Problem erklärt:
double vsum1 = v.sum();
double vsum2 = 0; // compare with manually calculated sum
for(size_t i = 0; i < v.size(); ++i)
{
vsum2 += v(i);
}
cout << "sum1: " << vsum1 << endl;
cout << "sum2: " << vsum2 << endl;
für die alte Version, ist das Ergebnis
sum1: 94.8117866666666487
sum2: 94.8117866666666202
für die neue Version, ist das Ergebnis
sum1: 94.8117866666666345
sum2: 94.8117866666666202
Die manuell berechnete Summe vsum2
bleibt unverändert, also denke ich den Ursprungsvektor v
hat sich nicht geändert, warum würde dann sum()
ein anderes Ergebnis ergeben? Ist es wegen einige SIMD-Optimierung von Eigen durchgeführt?
Der Unterschied ist tatsächlich neligible, aber das führt zu einem Versagen der Regression Test.
Alte und neue Versionen laufen beide auf derselben Maschine? Ich nehme an, ja. – BitTickler
Ja, und kompiliert mit demselben Eigen – Alaya
Ja, wahrscheinlich ist das Vektorisierung oder andere Optimierungen dafür verantwortlich. Die Optimierung von Fließkomma-Operationen bedeutet normalerweise, dass die Bit-zu-Bit-Reproduzierbarkeit verbessert wird. Wenn möglich, ändern Sie Ihre Tests, um eine angemessene Toleranz zu ermöglichen. – 5gon12eder