Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Dass das bei exakter Rechnung nicht passieren kann, ist mir klar. (Folgt auch direkt aus dem Wertebereich von cos: R -> R, wenn man die Formel cos(angle(a, b)) = (<a,b>)/(|a||b|) als gegeben nimmt.)(Den Beweis bleibe ich schuldig, aber ich denke, man könnte mit der Unendlichnorm argumentieren). Rundungsfehler passieren hier auch nicht, da selbst bei Subtraktionsrundungen der Zähler nur kleiner werden kann, und der Nenner in der Euklidischen Norm keine Subtraktionen aufweist).
Ok, guter Punkt.Doch wie wird |a|, |b| jeweils ausgerechnet?
double abs(...)
{
double ret = 0.;
for(size_t i = 0; i < dim; ++i)
ret += vec[i] * vec[i]; //kein pow: Rundungsfehler bei pow!
return sqrt(ret); //sqrt ist eine der exaktesten Funktionen (siehe später)
}
Zumindest keine Cancellation Errors: http://en.cppreference.com/w/c/numeric/math/sqrtEnthält das Wurzelziehen keine Subtraktionen?
Man hat also einen Fehler von weniger als 0.5 * eps.sqrt is required by the IEEE standard to be exact. The only other operations required to be exact are the arithmetic operators and the function fma. After rounding to the return type (using default rounding mode), the result of sqrt is indistinguishable from the infinitely precise result. In other words, the error is less than 0.5 ulp. Other functions, including pow, are not so constrained.