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ανάγει πρώτα το όρισμά του modulo2π, και για|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- ημίτονο μιας γωνίας σε ακτίνια· η συντροφική συνάρτηση που χρησιμοποιείται συχνότερα παράλληλα με τοcosatan2- τόξο εφαπτομένης δύο ορισμάτων, το συνηθισμένο δομικό στοιχείο για την αντίστροφη τριγωνομετρία (acos,asin) σε καθαρή Perlsqrt- τετραγωνική ρίζα· εμφανίζεται στην κλασική ταυτότητα τουacosacos(x) = atan2(sqrt(1 - x*x), x)Math::Trigext -acos,asin,atan, υπερβολικές παραλλαγές,deg2rad/rad2degκαι βοηθητικά μεγάλου κύκλουMath::Complexext - υπερφορτώνει τοcos(και το υπόλοιπο της τριγωνομετρικής οικογένειας) για μιγαδικά ορίσματαPOSIX- εκθέτει τηνacosαπευθείας, καθώς καιisnan/isinfγια την ανίχνευση των μη πεπερασμένων αποτελεσμάτων που συζητήθηκαν παραπάνω