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

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) delivers

    • typically ~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)) για θετικό $x

  • POSIX::log10 - λογάριθμος με βάση 10, απευθείας από τη C library· ταχύτερος και ελαφρώς ακριβέστερος από το log($x)/log(10)

  • POSIX::log2 - λογάριθμος με βάση 2, ίδια ιστορία

  • POSIX::log1p - το log(1 + $x) υπολογισμένο με ακρίβεια για μικρά $x, εκεί όπου η αφελής μορφή χάνει ακρίβεια