Αριθμητικές συναρτήσεις

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 είναι ό,τι επιστρέφει η 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 — ημίτονο· σε ζεύγος με τη cos για ανακατασκευή των συντεταγμένων μιας γωνίας αφότου την έχει εξαγάγει η atan2

  • cos — συνημίτονο· η συνιστώσα X κατά τη μετατροπή ακτίνας και γωνίας ξανά σε καρτεσιανές συντεταγμένες

  • sqrt — τετραγωνική ρίζα· χρησιμοποιείται με την atan2 στη μετατροπή Καρτεσιανών → πολικών ($r, $theta) = (sqrt($x**2+$y**2), atan2($y,$x))

  • Math::Trigext — παρέχει tan, atan, asin, acos και την υπερβολική οικογένεια· εξάγει επίσης το pi ως σταθερά ώστε να μη χρειάζεται να γράψετε atan2(1,0)*2