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

sqrt#

Επιστρέφει τη μη αρνητική τετραγωνική ρίζα του EXPR.

Η sqrt υπολογίζει την κύρια τετραγωνική ρίζα - τον μοναδικό μη αρνητικό πραγματικό αριθμό του οποίου το τετράγωνο ισούται με EXPR. Για κάθε EXPR >= 0 το αποτέλεσμα είναι >= 0· η sqrt ποτέ δεν επιστρέφει την αρνητική ρίζα. Αν παραλειφθεί το EXPR, χρησιμοποιείται το $_.

Ο υπολογισμός εκτελείται σε κινητή υποδιαστολή διπλής ακρίβειας (IEEE 754 binary64), οπότε το αποτέλεσμα είναι float ακόμα και όταν η είσοδος είναι ακέραιος και ακόμα και όταν η μαθηματική απάντηση είναι η ίδια ακέραιος.

Σύνοψη#

sqrt EXPR
sqrt
sqrt(EXPR)

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

Αριθμός κινητής υποδιαστολής: η μη αρνητική τετραγωνική ρίζα του EXPR. Για αρνητική είσοδο το αποτέλεσμα είναι NaN (και εκπέμπεται προειδοποίηση υπό use warnings)· δείτε Οριακές περιπτώσεις. Για ρίζες με μιγαδικές τιμές φορτώστε το Math::Complexext, που υπερφορτώνει την sqrt ώστε η sqrt(-1) να επιστρέφει i.

my $r = sqrt 2;                     # 1.4142135623731
my $r = sqrt;                       # sqrt of $_

Το προεπιλεγμένο όρισμα, η προτεραιότητα, και η ανάλυση#

Τρεις λεπτομέρειες του αναλυτή διαμορφώνουν κάθε κλήση sqrt:

  • Χωρίς όρισμα χρησιμοποιεί το $_. Η sqrt χωρίς όρισμα και χωρίς παρενθέσεις διαβάζει τη μεταβλητή θέματος. Βολικό μέσα σε μπλοκ map και grep που ήδη δεσμεύουν το $_.

  • Προτεραιότητα ονομασμένου μοναδιαίου τελεστή. Η sqrt είναι ονομασμένος μοναδιαίος τελεστής, οπότε δένει πιο σφιχτά από τους περισσότερους δυαδικούς τελεστές αλλά πιο χαλαρά από τον πολλαπλασιασμό και την ύψωση σε δύναμη. Το sqrt 2 + 3 σημαίνει sqrt(2) + 3, όχι sqrt(2 + 3) - βάζετε παρενθέσεις όταν αμφιβάλλετε.

  • Το sqrt(...) είναι κλήση συνάρτησης. Όπως με κάθε ονομασμένο μοναδιαίο, αν γράψετε ανοιχτή παρένθεση αμέσως μετά το όνομα μετατρέπει το υπόλοιπο σε λίστα ορισμάτων: το sqrt(4) * 2 είναι 4 (η τετραγωνική ρίζα του 4) επί 2, δηλαδή 4.

my @roots = map { sqrt } 1, 4, 9;   # (1, 2, 3); $_ is the topic
my $x = sqrt 2 + 3;                 # 4.41421…  - sqrt(2) + 3
my $y = sqrt(2 + 3);                # 2.23606…  - sqrt(5)

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

Κλασική άρρητη ρίζα. Το εκτυπωμένο δεκαδικό είναι η πλησιέστερη προσέγγιση binary64, όχι η ακριβής τιμή:

printf "%.15f\n", sqrt(2);          # 1.414213562373095

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

sub distance {
    my ($x1, $y1, $x2, $y2) = @_;
    return sqrt(($x2 - $x1) ** 2 + ($y2 - $y1) ** 2);
}

print distance(0, 0, 3, 4), "\n";   # 5

Το μηδέν είναι η τετραγωνική ρίζα του εαυτού του, όπως και το ένα:

print sqrt(0), "\n";                # 0
print sqrt(1), "\n";                # 1

Τα τέλεια τετράγωνα κάνουν ακριβή πλήρη κύκλο για μικρούς ακέραιους, επειδή το μαθηματικό αποτέλεσμα είναι αναπαραστάσιμο σε binary64:

print sqrt(16), "\n";               # 4
print sqrt(144), "\n";              # 12
print sqrt(1_000_000), "\n";        # 1000

Μεγάλα τέλεια τετράγωνα ενδέχεται να μην κάνουν ακριβή πλήρη κύκλο - το αποτέλεσμα είναι το πλησιέστερο αναπαραστάσιμο float, το οποίο μπορεί να είναι ελαφρώς διαφορετικό:

my $n = 9_007_199_254_740_996;      # 2**53 + 4
printf "%.3f\n", sqrt($n) ** 2 - $n; # non-zero in general

Σύγκριση με τον τελεστή ύψωσης σε δύναμη, που είναι ο γενικός τρόπος για να πάρετε οποιαδήποτε πραγματική δύναμη:

print 2 ** 0.5, "\n";               # same as sqrt(2)
print 27 ** (1/3), "\n";            # cube root of 27 ≈ 3

Χρήση του Math::Complexext για να λάβετε μιγαδικό αποτέλεσμα από αρνητική είσοδο:

use Math::Complex;
my $z = sqrt(-1);                   # i
print $z, "\n";                     # "i"
print sqrt(-4), "\n";               # "2i"

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

  • Αρνητική είσοδος χωρίς Math::Complexext: επιστρέφει NaN και πυροδοτεί προειδοποίηση Invalid operation υπό use warnings. Το NaN συγκρίνεται ως άνισο με τον εαυτό του, οπότε μην το ελέγχετε ποτέ με ==· χρησιμοποιήστε POSIX::isnan ή ελέγξτε $x != $x.

    my $r = sqrt(-1);                 # NaN
    print "bad\n" if $r != $r;        # NaN self-compare trick
    
  • Αρνητική είσοδος με Math::Complexext: όταν φορτωθεί το Math::Complexext, η sqrt υπερφορτώνεται για μιγαδικά βαθμωτά και επιστρέφει την κύρια μιγαδική ρίζα. Οι πραγματικές είσοδοι εξακολουθούν να περνούν από την ενσωματωμένη.

  • Μη αριθμητική είσοδος: εξαναγκάζεται σε αριθμό με τους συνηθισμένους κανόνες - οι αρχικοί λευκοί χαρακτήρες και ένα αριθμητικό πρόθεμα καταναλώνονται, τα υπόλοιπα αγνοούνται. Υπό use warnings πυροδοτείται προειδοποίηση isn't numeric όταν η συμβολοσειρά δεν έχει καθόλου αριθμητικό πρόθεμα. Το undef εξαναγκάζεται σε 0.

    print sqrt("9abc"), "\n";         # 3, with a warning under warnings
    print sqrt(""), "\n";             # 0, with a warning
    print sqrt(undef), "\n";          # 0, with an uninitialized warning
    
  • Ανακρίβεια κινητής υποδιαστολής για τέλεια τετράγωνα: για αρκετά μεγάλους ακέραιους, η μαθηματικά ακριβής ρίζα μπορεί να μην είναι αναπαραστάσιμη. Η sqrt($n*$n) δεν εγγυάται ότι ισούται με $n για μεγάλο $n. Αν χρειάζεστε ακριβή ακέραια τετραγωνική ρίζα, μη χρησιμοποιείτε την sqrt - χρησιμοποιήστε την bsqrt του Math::BigIntext ή ειδική υλοποίηση isqrt.

  • Ειδικές τιμές IEEE: η sqrt("Inf") είναι Inf· η sqrt("NaN") είναι NaN· η sqrt(-0.0) είναι -0.0 (αρνητικό μηδέν, που συγκρίνεται ίσο με 0). Η sqrt("-Inf") είναι NaN.

  • Η ακέραια υπερχείλιση δεν είναι ζήτημα: επειδή το αποτέλεσμα είναι πάντα float, η sqrt ποτέ δεν υπερχειλίζει για οποιαδήποτε πεπερασμένη αριθμητική είσοδο.

  • Το περιβάλλον λίστας είναι άσχετο: η sqrt επιστρέφει πάντα ένα βαθμωτό. Σε περιβάλλον λίστας αυτό το βαθμωτό είναι το μόνο στοιχείο της επιστρεφόμενης λίστας.

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

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

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

  • abs - απόλυτη τιμή· συνδυάστε με την sqrt όταν θέλετε sqrt(abs($x)) για να αποφύγετε αρνητική είσοδο

  • ** - τελεστής ύψωσης σε δύναμη· το $x ** 0.5 είναι sqrt, και το $x ** (1/$n) γενικεύεται σε άλλες ρίζες

  • hypot - από το POSIX, υπολογίζει sqrt($x*$x + $y*$y) χωρίς ενδιάμεση υπερχείλιση

  • Math::Complexext - υπερφορτώνει την sqrt και παρόμοιες ώστε η sqrt(-1) να επιστρέφει i αντί για NaN

  • Math::BigIntext, Math::BigFloatext - τετραγωνικές ρίζες αυθαίρετης ακρίβειας μέσω της bsqrt όταν το binary64 δεν επαρκεί