Ich erlebe, was ich denke, ist seltsames Verhalten mit Cross-Produkt in numpy
mit etwas großen Werten.numerische Präzision von Kreuzprodukt in numpy
Z. B. scheint die folgende richtige:
r = 1e15
a = array([1, 2, 3]) * r;
b = array([-1, 2, 1]) * r;
c = cross(a/norm(a), b/norm(b));
print(dot(c, a)) # outputs 0.0
Aber wenn wir die Exponenten um 1 erhöhen, erhalten wir:
r = 1e16
a = array([1, 2, 3]) * r;
b = array([-1, 2, 1]) * r;
c = cross(a/norm(a), b/norm(b));
print(dot(c, a)) # outputs 2.0
Die Zahlen für größere Werte des Exponenten noch bizarrer bekommen. Weiß jemand, was hier vor sich geht? Vielen Dank!
Sind Sie sicher, dass das Problem behoben wird? Eine 64-Bit Gleitkommazahl sollte eine Mantisse von 11 Bit haben, richtig? Das sollte sicherlich mit der Größe von Zahlen umgehen, mit denen ich arbeite. – Brian
Okay - ich sehe es jetzt - es passiert in der Präzision der Multiplikation während des Skalarproduktes. 'a' ist groß. Die numerische Genauigkeit eines 64-Bit-Floats beträgt 52 Bit. 2^52 ist knapp über 10^15, danach scheinen die Probleme mit dem Rundungsfehler zu eskalieren. Ich denke, es wäre hilfreich, die Größe des 64-Bit-Gleitkomma-Koeffizienten und der Mantisse in der Antwort zu erwähnen. Danke für die Hilfe! – Brian