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αντί γιαNaNMath::BigIntext,Math::BigFloatext - τετραγωνικές ρίζες αυθαίρετης ακρίβειας μέσω τηςbsqrtόταν τοbinary64δεν επαρκεί