Laut Wolfram Alpha und dem Sage-Computeralgebrasystem gilt folgende Identität:
Als ich jedoch versuchte, es mit einem beliebigen Beispiel in NumPy zu verifizieren, bemerkte ich einen ziemlich großen Unterschied in den tatsächlichen Werten, die von beiden Seiten der Identität berechnet wurden. Ich habe den folgenden Code verwendet:
l1 = 10; l2 = 8; d = 17
from numpy import arctan2, cos, sin, sqrt
alpha = arctan2((l1-l2),d)
left = cos(alpha)
right = sqrt(1 + ((l1-l2)**2)/(d**2))
Die Auswertung der Ergebnisse für left
und right
der folgenden ergab:
left = 0.99315060432287616
right = 1.0
Es ist verlockend, dies einfach als numerischen Fehler abzuschreiben, aber da ich nur sehr wenig Erfahrung damit habe, wie groß numerische Fehler werden können, bin ich mir nicht so sicher. Ist das möglich oder fehlt mir etwas (offensichtliches)?
right
ist falsch eingegeben. es sollte seinright = 1/sqrt()
Wenn ich die Formeln in meinen Ti-89 eingebe, bekomme ich eine Übereinstimmung mit 12 Stellen bei 0,99315 ...Antworten:
Ich habe den Verdacht, dass Ihr Python-Ausdruck für die rechte Seite eine Ganzzahldivision und keine Gleitkommadivision durchführt. Infolgedessen
((l1-l2)**2)/(d**2)
wird als Null ausgewertet, und der Term innerhalb der Quadratwurzel ist Eins.Tatsächlich haben Sie das Gegenteil auch in Ihrem rechten Ausdruck vergessen, aber das ist nicht das erste Problem ...
In MATLAB:
quelle
from __future__ import division
mir angewöhnt, zu diesem Zweck alle meine Python-Skripte ganz oben zu verwenden.Wie Michael C. Grant betonte, besteht das Problem darin, dass die Divisionsoperation eine ganzzahlige Division und keine Gleitkommadivision ist. In Versionen von Python vor 3 werden zwei Ganzzahlen durch
/
Runden auf eine Ganzzahl geteilt. Dieses Verhalten kann durch Hinzufügen geändert werdenoben in Ihrem Skript. Beachten Sie, dass diese Deklaration das Verhalten
/
nur für die aktuelle Datei ändert . Wenn Sie gelegentlich das ursprüngliche Verhalten wünschen, verwenden Sie//
(doppelter Schrägstrich). Dies wird hier ausführlicher besprochen:PEP 238 - Ändern des Abteilungsbetreibers
Beachten Sie, dass die meisten Sprachen, einschließlich C, eine ähnliche Semantik für die Division haben, die Semantik in Python jedoch verwirrender ist, da Ganzzahlen normalerweise nicht zu Floats heraufgestuft werden, wenn sie an Funktionen übergeben werden. Somit kann eine Funktion, die so geschrieben ist, als ob sie auf Floats arbeitet, tatsächlich auf ganzen Zahlen arbeiten.
quelle