log#
Επιστρέφει τον φυσικό λογάριθμο (βάση e) ενός αριθμού.
Η log είναι η αντίστροφη της exp. Παίρνει αριθμητική EXPR, την εξαναγκάζει σε float διπλής ακρίβειας αν χρειάζεται, και επιστρέφει τον λογάριθμό της με βάση e (αριθμός του Euler, περίπου 2.718281828459045). Αν η EXPR παραλείπεται, η log λειτουργεί επί της $_.
Δεν υπάρχει ενσωματωμένη για λογαρίθμους σε αυθαίρετη βάση - χρησιμοποιήστε βασική άλγεβρα (δείτε τα παραδείγματα παρακάτω) ή τις POSIX::log10 / POSIX::log2 για τις δύο συνηθισμένες σταθερές βάσεις.
Σύνοψη#
log EXPR
log
Τι επιστρέφεται#
Float διπλής ακρίβειας: ο φυσικός λογάριθμος της EXPR. Συγκεκριμένα:
Το
log(1)είναι0.Το
log(exp(1))είναι1(η ταυτότητα ορισμού).Το
log(x)είναι γνησίως αύξον γιαx > 0.
Οι ειδικές είσοδοι ακολουθούν τους κανόνες IEEE-754 όπως τους παρέχει η log(3) της C library της πλατφόρμας:
Το
log(0)επιστρέφει αρνητικό άπειρο (-Inf).Το
log(x)γιαx < 0επιστρέφειNaN.Το
log(Inf)επιστρέφειInf· τοlog(NaN)επιστρέφειNaN.
Το αποτέλεσμα είναι πάντα float, ακόμη και όταν η είσοδος είναι ακέραιος ή συμβολοσειρά.
Παραδείγματα#
Η ταυτότητα ορισμού - ο φυσικός λογάριθμος του e είναι 1:
use POSIX ();
print log(exp(1)), "\n"; # 1
Λογάριθμος με βάση 10, χτισμένος από τη log με αλλαγή βάσης. Ο λογάριθμος με βάση N ενός αριθμού ισούται με τον φυσικό λογάριθμό του διά τον φυσικό λογάριθμο του N:
sub log10 {
my ($n) = @_;
return log($n) / log(10);
}
print log10(1000), "\n"; # 3
print log10(0.01), "\n"; # -2
Το ίδιο ιδίωμα γενικευμένο σε οποιαδήποτε βάση - χρήσιμο για bits (βάση 2), ντεσιμπέλ (βάση 10), ή οτιδήποτε άλλο:
sub log_base {
my ($base, $n) = @_;
return log($n) / log($base);
}
print log_base(2, 1024), "\n"; # 10
print log_base(16, 65536), "\n"; # 4
Λειτουργία επί της $_ - βολικό μέσα σε map ή σε βρόχο γραμμών while:
my @natural_logs = map { log } 1, 2, 3, 4;
Αριθμητικός εξαναγκασμός ορίσματος συμβολοσειράς - η log αποτιμά τον τελεστή της σε αριθμητικό περιβάλλον όπως ακριβώς και οι αριθμητικοί τελεστές:
print log("7.389056"), "\n"; # ~2 (log of e^2, give or take)
Οριακές περιπτώσεις#
Το
log(0)είναι-Inf, όχι σφάλμα και όχι εξαίρεση διαίρεσης με το μηδέν. Η Perl δεν πεθαίνει· λαμβάνετε άπειρο σε float και κάθε επόμενη αριθμητική το διαδίδει:my $x = log(0); # -Inf print $x + 1, "\n"; # -Inf
Η
logαρνητικού αριθμού είναιNaN. Και πάλι, καμία εξαίρεση - ο καλών είναι υπεύθυνος για τον έλεγχο εύρους αν αυτό έχει σημασία:my $x = log(-1); # NaN print $x == $x ? "num" : "nan", "\n"; # nan (NaN != NaN)
Προστατεύστε την είσοδο αν χρειάζεστε ορισμένο αποτέλεσμα:
die "log domain error" unless $n > 0; my $l = log($n);
Μη αριθμητικές συμβολοσειρές εξαναγκάζονται σε
0και συνεπώς παράγουν-Inf, και υπόuse warningsενεργοποιούνArgument "..." isn't numeric:use warnings; print log("hello"), "\n"; # -Inf, with warning
Η μορφή χωρίς όρισμα χρησιμοποιεί την
$_. Ηlogμε κενή λίστα ορισμάτων διαβάζει το τρέχον θέμα· μέσα σεmap { log }ήwhile (<>) { print log; }αυτή είναι η συνηθισμένη συντόμευση.Ακέραιη έναντι float εισόδου δεν κάνει διαφορά στον τύπο αποτελέσματος: η τιμή επιστροφής είναι πάντα float. Το
log(2)και τοlog(2.0)είναι η ίδια τιμή.Precision is whatever the platform C library’s
log(3)deliverstypically ~15–17 significant decimal digits on x86-64 Linux. Results are not bit-for-bit portable across architectures.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
exp- η αντίστροφη: τοexp(log($x))είναι$xγια$x > 0, και τοlog(exp($x))είναι$xγια κάθε πεπερασμένο$x**- ο τελεστής ύψωσης σε δύναμη· το$x ** $yείναι ισοδύναμο μεexp($y * log($x))για θετικό$xPOSIX::log10- λογάριθμος με βάση 10, απευθείας από τη C library· ταχύτερος και ελαφρώς ακριβέστερος από τοlog($x)/log(10)POSIX::log2- λογάριθμος με βάση 2, ίδια ιστορίαPOSIX::log1p- τοlog(1 + $x)υπολογισμένο με ακρίβεια για μικρά$x, εκεί όπου η αφελής μορφή χάνει ακρίβεια