atan2#
Τόξο εφαπτομένης του Y/X στο εύρος -π έως π.
Η atan2 είναι το τόξο εφαπτομένης δύο ορισμάτων — η αντίστροφη της εφαπτομένης που διατηρεί αρκετή πληροφορία για τις εισόδους της ώστε να επιστρέψει το σωστό τεταρτημόριο. Σε αντίθεση με την atan ενός ορίσματος, που συμπτύσσει τα δύο πρόσημα των Y και X σε έναν λόγο και δεν μπορεί να ξεχωρίσει το άνω ημιεπίπεδο από το κάτω, η atan2 εξετάζει και τα δύο ορίσματα και επιστρέφει γωνία που καλύπτει ολόκληρο τον κύκλο: (-π, π] ακτίνια. Είναι ο κανονικός τρόπος στην Perl να μετατρέψετε καρτεσιανές συντεταγμένες (X, Y) στην πολική γωνία θ.
Σύνοψη#
atan2 Y, X
Τι επιστρέφεται#
Αριθμός κινητής υποδιαστολής, η γωνία σε ακτίνια μεταξύ του θετικού άξονα x και του σημείου (X, Y), μετρούμενη αντίστροφα από τους δείκτες του ρολογιού. Εύρος: -π < result ≤ π. Το πρόσημο ακολουθεί το Y: θετικό Y δίνει θετική γωνία (άνω ημιεπίπεδο), αρνητικό Y δίνει αρνητική γωνία (κάτω ημιεπίπεδο). Για να μετατρέψετε σε μοίρες πολλαπλασιάστε επί 180 / π:
my $deg = atan2($y, $x) * 180 / 3.14159265358979;
Παραδείγματα#
Υπολογισμός του π στην ακρίβεια της μηχανής. Η γωνία από την αρχή έως το (0, 1) είναι ακριβώς π/2, οπότε το atan2(1, 0) * 2 δίνει π:
my $pi = atan2(1, 0) * 2;
printf "%.15f\n", $pi; # 3.141592653589793
Διαχείριση τεταρτημορίων. Οι τέσσερις βασικές κατευθύνσεις πέφτουν σε ακριβή πολλαπλάσια του π/2, με το (−1, 0) στο σύνορο +π, όχι -π:
print atan2( 1, 0), "\n"; # 1.5707963267949 (+π/2, up)
print atan2( 0, 1), "\n"; # 0 (right)
print atan2(-1, 0), "\n"; # -1.5707963267949 (-π/2, down)
print atan2( 0, -1), "\n"; # 3.14159265358979 (+π, left)
Πολική μετατροπή. Δοθέντος ενός σημείου (X, Y), ανακτήστε ακτίνα και γωνία:
my ($x, $y) = (3, 4);
my $r = sqrt($x*$x + $y*$y); # 5
my $theta = atan2($y, $x); # 0.927295218001612 rad ≈ 53.13°
Εφαπτομένη μέσω της τυπικής ταυτότητας. Η Perl δεν έχει ενσωματωμένη tan, αλλά οι sin και cos τη δίνουν άμεσα — και η atan2 αντιστρέφει το αποτέλεσμα χωρίς ασάφεια:
sub tan { sin($_[0]) / cos($_[0]) }
my $angle = 0.7;
print atan2(tan($angle), 1), "\n"; # 0.7 (recovers the input)
Σάρωση πλήρους κύκλου. Επαναλαμβάνοντας το Y γύρω από τον μοναδιαίο κύκλο φαίνεται ότι το εύρος καλύπτει το (-π, π]:
for my $deg (0, 45, 90, 135, 180, -135, -90, -45) {
my $rad = $deg * 3.14159265358979 / 180;
printf "%4d° -> %+.4f rad\n",
$deg, atan2(sin($rad), cos($rad));
}
Οριακές περιπτώσεις#
Και τα δύο ορίσματα μηδέν: η
atan2(0, 0)είναι μαθηματικά απροσδιόριστη. Η τιμή που επιστρέφει η Perl είναι ό,τι επιστρέφει η Catan2(3)της πλατφόρμας για αυτή την περίπτωση — σε glibc και musl αυτή είναι0, και το POSIX επιτρέπει οποιαδήποτε τιμή στο[-π, π]. Μη βασίζεστε σε συγκεκριμένο αποτέλεσμα· ελέγξτε για($x == 0 && $y == 0)πριν την κλήση αν το μηδέν είναι πραγματική πιθανότητα στις εισόδους σας.Προσημασμένα μηδενικά: σε πλατφόρμες IEEE-754 η
atan2(+0, -0)επιστρέφει+πκαι ηatan2(-0, -0)επιστρέφει-π. Αυτό έχει σημασία μόνο σε κώδικα που σκόπιμα παρακολουθεί τα πρόσημα του μηδενός· ο περισσότερος κώδικας Perl δεν τα διακρίνει ποτέ.Άπειρα:
atan2(Inf, Inf) == π/4,atan2(Inf, -Inf) == 3π/4,atan2(-Inf, Inf) == -π/4,atan2(-Inf, -Inf) == -3π/4. Η κατεύθυνση «προς(±Inf, ±Inf)» παραμένει μια καλά ορισμένη γωνία που διχοτομεί το αντίστοιχο τεταρτημόριο.Είσοδοι NaN: αν είτε το
Yείτε τοXείναιNaN, το αποτέλεσμα είναιNaN. Διαδίδεται μέσα από κάθε περαιτέρω αριθμητική πράξη — προστατευτείτε με έναν έλεγχοScalar::Util::looks_like_numberσε εισόδους από μη έμπιστες πηγές.Μη αριθμητικά ορίσματα: οι συμβολοσειρές εξαναγκάζονται σε αριθμούς με τους συνήθεις κανόνες της Perl. Η
atan2("3", "4")λειτουργεί· ηatan2("abc", 1)είναι ισοδύναμη μεatan2(0, 1)και εκπέμπει προειδοποίησηArgument "abc" isn't numericυπόuse warnings.Η σειρά ορισμάτων είναι
Y, X, όχιX, Y: αυτό ταιριάζει με τηνatan2(3)της C, τηνATAN2της FORTRAN και του τόξου εφαπτομένης δύο ορισμάτων κάθε άλλης γλώσσας. Η αντιστροφή των ορισμάτων δίνει τη συμπληρωματική γωνία — ένα διακριτικό σφάλμα που οι έλεγχοι σε ένα μόνο τεταρτημόριο θα παραβλέψουν.Η
atan2δεν είναι ηatan: δεν υπάρχει μορφή ενός ορίσματος. Τοatan2($ratio)είναι συντακτικό σφάλμα στο σημείο κλήσης. Για το τόξο εφαπτομένης ενός ορίσματος, χρησιμοποιήστεMath::Trig::atanήPOSIX::atan, ή γράψτε το ωςatan2($ratio, 1).
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
sin— ημίτονο· σε ζεύγος με τηcosγια ανακατασκευή των συντεταγμένων μιας γωνίας αφότου την έχει εξαγάγει ηatan2cos— συνημίτονο· η συνιστώσαXκατά τη μετατροπή ακτίνας και γωνίας ξανά σε καρτεσιανές συντεταγμένεςsqrt— τετραγωνική ρίζα· χρησιμοποιείται με τηνatan2στη μετατροπή Καρτεσιανών → πολικών($r, $theta) = (sqrt($x**2+$y**2), atan2($y,$x))Math::Trigext — παρέχειtan,atan,asin,acosκαι την υπερβολική οικογένεια· εξάγει επίσης τοpiως σταθερά ώστε να μη χρειάζεται να γράψετεatan2(1,0)*2