*[Αριθμητικές συναρτήσεις](../perlfunc-by-category.md)* # atan2 Τόξο εφαπτομένης του `Y/X` στο εύρος -π έως π. Η `atan2` είναι το τόξο εφαπτομένης δύο ορισμάτων — η αντίστροφη της εφαπτομένης που διατηρεί αρκετή πληροφορία για τις εισόδους της ώστε να επιστρέψει το σωστό τεταρτημόριο. Σε αντίθεση με την `atan` ενός ορίσματος, που συμπτύσσει τα δύο πρόσημα των `Y` και `X` σε έναν λόγο και δεν μπορεί να ξεχωρίσει το άνω ημιεπίπεδο από το κάτω, η `atan2` εξετάζει και τα δύο ορίσματα και επιστρέφει γωνία που καλύπτει ολόκληρο τον κύκλο: `(-π, π]` ακτίνια. Είναι ο κανονικός τρόπος στην Perl να μετατρέψετε καρτεσιανές συντεταγμένες `(X, Y)` στην πολική γωνία θ. ## Σύνοψη ```perl atan2 Y, X ``` ## Τι επιστρέφεται Αριθμός κινητής υποδιαστολής, η γωνία σε ακτίνια μεταξύ του θετικού άξονα x και του σημείου `(X, Y)`, μετρούμενη αντίστροφα από τους δείκτες του ρολογιού. Εύρος: `-π < result ≤ π`. Το πρόσημο ακολουθεί το `Y`: θετικό `Y` δίνει θετική γωνία (άνω ημιεπίπεδο), αρνητικό `Y` δίνει αρνητική γωνία (κάτω ημιεπίπεδο). Για να μετατρέψετε σε μοίρες πολλαπλασιάστε επί `180 / π`: ```perl my $deg = atan2($y, $x) * 180 / 3.14159265358979; ``` ## Παραδείγματα Υπολογισμός του π στην ακρίβεια της μηχανής. Η γωνία από την αρχή έως το `(0, 1)` είναι ακριβώς π/2, οπότε το `atan2(1, 0) * 2` δίνει π: ```perl my $pi = atan2(1, 0) * 2; printf "%.15f\n", $pi; # 3.141592653589793 ``` Διαχείριση τεταρτημορίων. Οι τέσσερις βασικές κατευθύνσεις πέφτουν σε ακριβή πολλαπλάσια του π/2, με το `(−1, 0)` στο σύνορο `+π`, όχι `-π`: ```perl 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)`, ανακτήστε ακτίνα και γωνία: ```perl 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`](sin.md) και [`cos`](cos.md) τη δίνουν άμεσα — και η `atan2` αντιστρέφει το αποτέλεσμα χωρίς ασάφεια: ```perl sub tan { sin($_[0]) / cos($_[0]) } my $angle = 0.7; print atan2(tan($angle), 1), "\n"; # 0.7 (recovers the input) ``` Σάρωση πλήρους κύκλου. Επαναλαμβάνοντας το `Y` γύρω από τον μοναδιαίο κύκλο φαίνεται ότι το εύρος καλύπτει το `(-π, π]`: ```perl 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 είναι ό,τι επιστρέφει η C `atan2(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`](sin.md) — ημίτονο· σε ζεύγος με τη [`cos`](cos.md) για ανακατασκευή των συντεταγμένων μιας γωνίας αφότου την έχει εξαγάγει η `atan2` - [`cos`](cos.md) — συνημίτονο· η συνιστώσα `X` κατά τη μετατροπή ακτίνας και γωνίας ξανά σε καρτεσιανές συντεταγμένες - [`sqrt`](sqrt.md) — τετραγωνική ρίζα· χρησιμοποιείται με την `atan2` στη μετατροπή Καρτεσιανών → πολικών `($r, $theta) = (sqrt($x**2+$y**2), atan2($y,$x))` - Math::Trigext — παρέχει `tan`, `atan`, `asin`, `acos` και την υπερβολική οικογένεια· εξάγει επίσης το `pi` ως σταθερά ώστε να μη χρειάζεται να γράψετε `atan2(1,0)*2`