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

cos#

Επιστρέφει το συνημίτονο ενός αριθμού δοσμένου σε ακτίνια.

Το cos είναι το τυπικό τριγωνομετρικό συνημίτονο: δέχεται μια γωνία μετρημένη σε ακτίνια και επιστρέφει τον λόγο της προσκείμενης πλευράς προς την υποτείνουσα του αντίστοιχου ορθογωνίου τριγώνου. Αν παραλειφθεί η EXPR, η cos ενεργεί επί της $_. Το αποτέλεσμα είναι πάντα αριθμός κινητής υποδιαστολής στο κλειστό διάστημα [-1, 1].

Σύνοψη#

cos EXPR
cos

Τι επιστρέφεται#

Αριθμός κινητής υποδιαστολής διπλής ακρίβειας στο [-1, 1]. Η Perl προωθεί την κλήση στη ρουτίνα C cos(3) της πλατφόρμας, οπότε η ακρίβεια και η συμπεριφορά στρογγυλοποίησης ταιριάζουν με τη libm σας. Οι ειδικές τιμές ακολουθούν το IEEE 754: το cos(0) είναι ακριβώς 1, τα cos("inf") και cos("nan") είναι αμφότερα NaN.

Ακτίνια, όχι μοίρες#

Το πιο συχνό σφάλμα με το cos είναι να του δίνετε μοίρες. Μια πλήρης περιστροφή είναι 2 * π ακτίνια, όχι 360. Μετατρέψτε μία φορά και κρατήστε τη μετατραμμένη τιμή:

use POSIX qw(acos);
my $pi = acos(-1);                  # π to full double precision

sub deg2rad { $_[0] * $pi / 180 }

print cos( deg2rad(60) ), "\n";     # 0.5
print cos( 60 ), "\n";              # -0.952412980415 - wrong if you meant degrees

Το Math::Trigext εξάγει τις deg2rad και rad2deg αν προτιμάτε να μη γράψετε μόνοι σας τη μετατροπή.

Παραδείγματα#

Διατρέξτε τον μοναδιαίο κύκλο σε οκτώ βήματα και τυπώστε (cos θ, sin θ):

use POSIX qw(acos);
my $pi = acos(-1);

for my $k (0 .. 7) {
    my $theta = $k * $pi / 4;
    printf "%.3f  %+.3f  %+.3f\n",
           $theta, cos($theta), sin($theta);
}

Συγκρίνετε το cos με τη σειρά Taylor γύρω από το μηδέν. Για μικρά $x το ανάπτυγμα τεσσάρων όρων είναι ήδη ακριβές μέχρι δέκα δεκαδικά ψηφία - ένας χρήσιμος έλεγχος ορθότητας κατά τη μεταφορά αριθμητικού κώδικα:

sub cos_taylor {
    my $x = shift;
    my $x2 = $x * $x;
    1 - $x2/2 + $x2*$x2/24 - $x2*$x2*$x2/720;
}

my $x = 0.3;
printf "libm:   %.15f\n", cos($x);
printf "taylor: %.15f\n", cos_taylor($x);

Προεπιλεγμένο όρισμα. Μέσα σε έναν βρόχο while (<>) το cos χωρίς όρισμα διαβάζει την τρέχουσα γραμμή - σχεδόν πάντα σφάλμα, αλλά η γλώσσα το επιτρέπει:

$_ = 0;
print cos, "\n";                    # 1

Αντίστροφο συνημίτονο μέσω της ταυτότητας από το perlfunc:

sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }

print acos(0.5), "\n";              # 1.0471975511966 (= π/3)

Χρήση του Math::Trigext για το πλήρες σύνολο των αντίστροφων και υπερβολικών συναρτήσεων αντί να γράψετε δικές σας:

use Math::Trig;
print acos(0.5), "\n";              # same result, no hand-written formula

Οριακές περιπτώσεις#

  • Τα μη αριθμητικά ορίσματα εξαναγκάζονται σε 0. Το cos("hello") επιστρέφει 1 διότι η συμβολοσειρά αριθμοποιείται πρώτα σε 0. Υπό use warnings αυτό παράγει προειδοποίηση Argument "hello" isn't numeric in cos. Επικυρώστε την είσοδο με τη looks_like_number από το Scalar::Util αν η πηγή είναι μη έμπιστη.

  • Τα πολύ μεγάλα ορίσματα χάνουν ακρίβεια. Το cos ανάγει πρώτα το όρισμά του modulo , και για |x| της τάξης του 1e16 το πλησιέστερο αναπαραστάσιμο double διαφέρει από το x κατά περισσότερο από π. Το αποτέλεσμα είναι ακόμη αριθμός στο [-1, 1], αλλά είναι ουσιαστικά τυχαίο. Ανάγετε μόνοι σας τη γωνία πριν την κλήση αν συσσωρεύετε μια φάση επί πολλές επαναλήψεις.

  • Το undef εξαναγκάζεται σε 0 και επιστρέφει 1, με τη συνήθη προειδοποίηση uninitialized υπό use warnings.

  • Ειδικές τιμές IEEE: τα cos("inf"), cos("-inf") και cos("nan") επιστρέφουν όλα NaN. Συγκρίνετε με $result != $result (η μοναδική τιμή που δεν είναι ίση με τον εαυτό της) για να ανιχνεύσετε NaN, ή χρησιμοποιήστε POSIX::isnan.

  • Δεν υπάρχει υποστήριξη μιγαδικών αριθμών στο ενσωματωμένο. Για μιγαδικά ορίσματα χρησιμοποιήστε το Math::Complexext, το οποίο υπερφορτώνει το cos μέσω υπερφόρτωσης τελεστών:

    use Math::Complex;
    my $z = cplx(1, 2);
    print cos($z), "\n";              # 2.03272300701967-3.0518977991518i
    

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • sin - ημίτονο μιας γωνίας σε ακτίνια· η συντροφική συνάρτηση που χρησιμοποιείται συχνότερα παράλληλα με το cos

  • atan2 - τόξο εφαπτομένης δύο ορισμάτων, το συνηθισμένο δομικό στοιχείο για την αντίστροφη τριγωνομετρία (acos, asin) σε καθαρή Perl

  • sqrt - τετραγωνική ρίζα· εμφανίζεται στην κλασική ταυτότητα του acos acos(x) = atan2(sqrt(1 - x*x), x)

  • Math::Trigext - acos, asin, atan, υπερβολικές παραλλαγές, deg2rad/rad2deg και βοηθητικά μεγάλου κύκλου

  • Math::Complexext - υπερφορτώνει το cos (και το υπόλοιπο της τριγωνομετρικής οικογένειας) για μιγαδικά ορίσματα

  • POSIX - εκθέτει την acos απευθείας, καθώς και isnan/isinf για την ανίχνευση των μη πεπερασμένων αποτελεσμάτων που συζητήθηκαν παραπάνω