Ich habe das Spiel mit C++ 11 in letzter Zeit, und kam mit der folgenden Summenfunktion auf:Compiler warnt nicht vor Präzisionsverlust?
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
Die Idee ist, dass ich eine Lambda-Funktion übergeben kann und somit eine saubere und gut lesbare Funktion für mathematische Summen. Ich habe dann versucht, die folgenden:
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
ich kompiliert diese mit g ++ 4.6.3: g++ -Wall -pedantic -std=c++0x -o test main.cpp
und geben keine Warnung über den Genauigkeitsverlust ich im Kommentar des Quellcodes bemerkt.
Es ist ziemlich wahrscheinlich, dass sum<int>
eine schlechte Sache zu tun ist, aber es ist vielleicht nicht so offensichtlich in komplexeren Kontexten. Sollte der Compiler nicht bemerken, dass der Rückgabewert meiner Lambda-Funktion double
ist, und mich warnen, dass ich beim Gießen an int
die Präzision verliere? Gibt es einen bestimmten Grund, warum nicht?
Die Funktion wird von der Präzision nicht darüber im Klaren sein becasue die Laufzeit eine implizite Umwandlung tut, bevor ihr die Argumente. Sie haben jedoch Recht, in einer idealen Welt sollten Sie zumindest eine Warnung im Visual Studio/Ihrer IDE sehen, um zu reflektieren, dass dies zu einem Präzisionsverlust führen würde. Aber ist es nicht so etwas, worum es bei Komponententests geht? – War
@Wardy in einer idealen Welt würde es nicht kompilieren (d. H. Es wäre ein Fehler, keine Warnung) ohne eine explizite Anfrage, diesen Präzisionsverlust zu verursachen. –
ok ... auch einen C# Entwickler im, und ich habe die Regeln von .net gehen (nicht sicher, ob Sie auch einen .net-Compiler verwenden, aber) heißt es in der Dokumentation, dass, wenn eine weniger genaue Art ein implizite erwartet wird Cast wird angewendet ... es wird als Merkmal der Sprache betrachtet. Ich stimme dir zu ... ein Fehler wäre der absolute Traum in deinem Szenario, aber meiner Erfahrung nach nicht die Plattform. – War