Eine Implementierung, die dem IEEE-754-Standard für zulässige Fehler für grundlegende Operationen entspricht (von denen sqrt
ein Beispiel ist) erfordert, dass die Werte korrekt gerundet werden.
Dies bedeutet, dass der Fehler weniger als 1/2 ULP (Einheit an der letzten Stelle) oder grundsätzlich so nah wie möglich an der tatsächlichen Antwort liegt.
Um Ihre Frage zu beantworten, wenn die tatsächliche Antwort ist genau darstellbar durch eine double
dann erhalten Sie die genaue Antwort.
Hinweis: Dies wird nicht vom C++ - Standard garantiert, sondern vom IEEE-754-Standard, der für die meisten Benutzer wahrscheinlich kein Problem darstellt.
Letztlich soll ein einfacher Test für Ihre Zwecke ausreichend sein:
for(int i = 0; i < (int)std::sqrt(std::numeric_limits<int>::max()); i++)
{
assert((int)(double)i == i);//Ensure exactly representable, because why not
assert(std::sqrt((double)i*i) == i);
}
Wenn dies passiert, ich sehe keinen Grund zur Sorge.
Wenn 5 nicht genau dargestellt werden kann, wie könnte es? Das Beste, auf das Sie hoffen können, ist, dass es auf 5 gekürzt wird. – chris
Wie 5 ist eine ganze Zahl, sollte es nicht genau dargestellt werden? Ich habe irgendwo gelesen, dass double genau die Werte im ganzzahligen Bereich speichern kann. –
@RafiKamal: Ein 64-Bit-IEEE-754-Float mit doppelter Genauigkeit kann den gesamten Bereich von 32-Bit-Ganzzahlen mit und ohne Vorzeichen ohne Verlust genau darstellen. Das regelt nur Typumwandlungen in genau diesem Fall.Es regelt nicht die Genauigkeit der Fließkomma-Bibliothek, die 'sqrt (x)' berechnet. –