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

abs#

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

Η abs παίρνει ένα μοναδικό βαθμωτό, το εξαναγκάζει σε αριθμητικό περιβάλλον και επιστρέφει το μέτρο του — την τιμή με αφαιρεμένο το πρόσημο. Οι μη αριθμητικές συμβολοσειρές μετατρέπονται με τους ίδιους κανόνες όπως στην αριθμητική (αρχικά κενά και προαιρετικό πρόσημο, ακολουθούμενα από ψηφία· τα υπόλοιπα απορρίπτονται, με προειδοποίηση υπό use warnings). Αν το VALUE παραλειφθεί, η abs λειτουργεί επί του $_.

Σύνοψη#

abs VALUE
abs
abs($x)

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

Ένας μη αρνητικός αριθμός. Το αποτέλεσμα είναι ακέραιος αν η είσοδος ήταν ακέραιος εντός του εύρους ακεραίων της πλατφόρμας, διαφορετικά αριθμός κινητής υποδιαστολής. Η abs δεν αλλάζει ποτέ το όρισμά της — το αποτέλεσμα είναι ένα νέο βαθμωτό, οπότε η abs $x αφήνει το $x ανέπαφο.

Καθολική κατάσταση που επηρεάζει#

Χωρίς όρισμα, η abs διαβάζει το $_. Δεν γράφει ούτε διαβάζει καμία άλλη ειδική μεταβλητή. Υπό use warnings, ένα μη αριθμητικό όρισμα προκαλεί την τυπική προειδοποίηση Argument "…" isn't numeric μέσω της κανονικής διαδρομής αριθμητικής μετατροπής.

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

Αφαίρεση του προσήμου από έναν ακέραιο:

print abs(-7);              # 7
print abs(7);               # 7

Μέτρο κινητής υποδιαστολής — το αποτέλεσμα διατηρεί την πλήρη ακρίβεια της εισόδου:

print abs(-3.14159);        # 3.14159
print abs(-1e-10);          # 1e-10

Χρήση της μορφής με προεπιλεγμένο όρισμα μέσα σε βρόχο επί του $_:

for (-3, -1, 0, 2, 4) {
    print abs, "\n";        # 3, 1, 0, 2, 4 on separate lines
}

Απόσταση μεταξύ δύο σημείων σε μια αριθμητική γραμμή:

sub distance { abs($_[0] - $_[1]) }
print distance(10, 3);      # 7
print distance(3, 10);      # 7

Συμβολοσειρά που μοιάζει με αρνητικό αριθμό — η abs αναλύει το αρχικό αριθμητικό πρόθεμα και αφαιρεί το πρόσημο:

print abs("-42");           # 42
print abs("  -3.5xyz");     # 3.5  (warning under use warnings)

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

  • Η abs(undef) επιστρέφει 0. Υπό use warnings εκπέμπει Use of uninitialized value in abs.

  • Μη αριθμητική συμβολοσειρά: η abs("hello") επιστρέφει 0 και υπό use warnings προειδοποιεί ότι το όρισμα δεν είναι αριθμητικό.

  • Όριο υπερχείλισης ακεραίου: η abs του πιο αρνητικού ακεραίου της πλατφόρμας (PERL_INT_MIN, π.χ. -2**63 σε 64-bit συστήματα) προάγεται σε αποτέλεσμα κινητής υποδιαστολής, επειδή το θετικό αντίστοιχο δεν χωράει σε προσημασμένο ακέραιο:

    use Config;
    my $min = -(2 ** ($Config{ivsize} * 8 - 1));
    print abs($min);            # 9.22337203685478e+18 on 64-bit
    
  • Ειδικές τιμές IEEE 754: η abs(-0.0) επιστρέφει 0 (θετικό μηδέν). Η abs("-Inf") επιστρέφει Inf. Η abs("NaN") επιστρέφει NaN — το NaN δεν έχει πρόσημο που η abs να μπορεί να αφαιρέσει με νόημα.

  • Μιγαδικοί αριθμοί και μεγάλοι ακέραιοι δεν υποστηρίζονται από την ενσωματωμένη συνάρτηση. Η use Math::Complex υπερφορτώνει την abs ώστε να υπολογίζει το μέτρο· τα Math::BigIntext και Math::BigFloatext παρέχουν τη δική τους αφαίρεση προσήμου σε αντικείμενα blessed μέσω υπερφόρτωσης τελεστών.

  • Δεν υπάρχει επιτόπια μορφή: η abs επιστρέφει πάντα νέο βαθμωτό. Για να αντικαταστήσετε την τιμή μιας μεταβλητής με το μέτρο της, εκχωρήστε ξανά:

    $x = abs $x;
    
  • Σημείωση συντακτικού αναλυτή: η μοναδιαία μορφή abs $x συνδέεται πιο σφιχτά από τον , αλλά πιο χαλαρά από τους περισσότερους αριθμητικούς τελεστές, οπότε το abs $x + 1 αναλύεται ως abs($x) + 1, όχι ως abs($x + 1). Βάλτε παρενθέσεις όταν αμφιβάλλετε:

    print abs $x + 1;           # abs($x) + 1
    print abs($x + 1);          # abs of the sum
    

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

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

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

  • sqrt — τετραγωνική ρίζα· όπως και η abs είναι καθαρή αριθμητική μοναδιαία συνάρτηση με μορφή προεπιλογής στο $_

  • int — αποκοπή προς το μηδέν· συνδυάζεται με την abs όταν θέλετε το ακέραιο μέτρο ενός αριθμού κινητής υποδιαστολής

  • sprintf — μορφοποιημένη αριθμητική έξοδος· χρησιμοποιήστε %d ή %g σε συνδυασμό με την abs για να αποδώσετε μη προσημασμένα μέτρα

  • $_ — το προεπιλεγμένο όρισμα όταν η abs καλείται χωρίς όρισμα