Αξιοποιήστε στο έπακρο τους αριθμούς με δεκαδικούς αριθμούς

Ένας από τους πιο συχνά χρησιμοποιούμενους τύπους δεδομένων στην Python είναι ο float, ο οποίος αντιπροσωπεύει αριθμούς κινητής υποδιαστολής. Οι αριθμοί κινητής υποδιαστολής είναι αριθμοί, θετικοί ή αρνητικοί, που έχουν δεκαδικό ψηφίο. Οι αριθμοί κινητής υποδιαστολής περιλαμβάνουν επίσης αριθμούς που αντιπροσωπεύονται με επιστημονική σημείωση, με τον χαρακτήρα e ή E να χρησιμοποιείται για να υποδηλώνει την ισχύ του 10.
Το Float είναι ένας πολύ σημαντικός τύπος δεδομένων καθώς μπορεί να αντιπροσωπεύει ένα ευρύ φάσμα πραγματικών αριθμών, από πολύ μικρούς αριθμούς έως πολύ μεγάλους αριθμούς.
Παραδείγματα αριθμών κινητής υποδιαστολής στην Python φαίνονται παρακάτω:
# float numbers a = 20.0 b = -51.51345 c = 65e7 d = -1.08E12 e = 2E10 print(type(a)) print(type(b)) print(type(c)) print(type(d)) print(type(e))
Παραγωγή:
<class 'float'> <class 'float'> <class 'float'> <class 'float'> <class 'float'>
Επιπλέον, επιτρέπουν πιο ακριβείς υπολογισμούς σε σύγκριση με τύπους δεδομένων, όπως ακέραιοι, που αφαιρούν το κλασματικό μέρος των αριθμών. Για παράδειγμα, με ακέραιους αριθμούς, ένας αριθμός όπως το 3.142 θα παριστάνεται απλώς ως 3.
Ωστόσο, ο τύπος δεδομένων float θα αντιπροσωπεύει τον πραγματικό αριθμό ως έχει, που είναι 3.142. Επομένως, οι τιμές float είναι πιο κατάλληλες για μαθηματικούς υπολογισμούς, καθώς αποδίδουν πιο ακριβή αποτελέσματα.
Από αυτή την άποψη, οι τιμές κινητής υποδιαστολής χρησιμοποιούνται ευρέως σε μοντελοποίηση πραγματικού κόσμου, μηχανική μάθηση, επιστήμη δεδομένων, χρηματοοικονομική και οικονομική ανάλυση, μαθηματικούς υπολογισμούς, γραφικά και οπτικοποιήσεις και επιστημονικούς και μηχανικούς υπολογισμούς.
Πίνακας περιεχομένων
Ακέραιοι έναντι Float στην Python
Οι ακέραιοι είναι ένας άλλος πολύ δημοφιλής τύπος δεδομένων στην Python. Σε αντίθεση με τους αριθμούς κινητής υποδιαστολής, οι ακέραιοι αριθμοί δεν έχουν υποδιαστολή. Οι ακέραιοι αριθμοί αποτελούνται από θετικούς ακέραιους αριθμούς, αρνητικούς αριθμούς και μηδέν, οι οποίοι δεν έχουν κλασματικό μέρος.
Οι ακέραιοι είναι χρήσιμοι όταν εκτελούμε πράξεις που περιλαμβάνουν ακέραιους αριθμούς, όπως κατά την καταμέτρηση ή την ευρετηρίαση. Στην Python, οι ακέραιες τιμές συμβολίζονται ως int.
Κάποιοι ακέραιοι αριθμοί φαίνονται παρακάτω:
a = 0 b = 968 c = -14 print(type(a)) print(type(b)) print(type(c))
Παραγωγή:
<class 'int'> <class 'int'> <class 'int'>
Μερικές από τις διαφορές μεταξύ ακεραίων και αριθμών κινητής υποδιαστολής στην Python περιλαμβάνουν:
Χαρακτηριστικό Ακέραιοι (int) Αριθμοί κινητής υποδιαστολής (float) Αντιπροσωπεύουν ολόκληρους αριθμούς, τους αρνητικούς αντίστοιχους και το μηδέν, όλα χωρίς δεκαδικό ψηφίο. Πραγματικοί αριθμοί με δεκαδικό ψηφίοΑκρίβεια Απεριόριστη ακρίβεια, επομένως δεν υπάρχει όριο στο πόσο μεγάλη ή μεγάλη μπορεί να είναι μια τιμή int. Ο μόνος περιορισμός θα είναι η διαθέσιμη μνήμη στο σύστημά σας. Έχετε περιορισμένη ακρίβεια. Η μεγαλύτερη τιμή float που μπορείτε να αποθηκεύσετε είναι περίπου 1,8 x 10308Χρήση μνήμηςΧρησιμοποιεί λιγότερη μνήμη που floatsΧρησιμοποιεί περισσότερη μνήμη από ακέραιες τιμές bitwise OperationsΕυρεία χρήση σε bitwise λειτουργίες Δεν χρησιμοποιούνται σχεδόν ποτέ σε bitwise operationsUsageΧρησιμοποιούνται συνήθως σε μέτρηση, ευρετηρίαση και επιστημονική χρήση σε υπολογιστικές μετρήσεις και bitwise τις περισσότερες μαθηματικές πράξεις
Διαφορετικοί τρόποι δημιουργίας και χρήσης Floats στην Python
Ένας εύκολος τρόπος για να ξεκινήσετε να εργάζεστε με τιμές float στην Python είναι να εκχωρήσετε σε μια μεταβλητή μια τιμή float όπως αυτή:
# assign a variable a float value a = 3.142
Ένας άλλος τρόπος για να λάβετε τιμές float είναι να μετατρέψετε ακέραιους και αριθμητικές συμβολοσειρές σε τιμές float χρησιμοποιώντας τον κατασκευαστή float(). Εάν περάσουμε έναν ακέραιο ή αριθμητικό συμβολοσειρά σε float(), θα μετατραπεί σε τιμή float όπως φαίνεται παρακάτω:
number1 = 2524 numString1 = "513.523" numString2 = "1341" # Convert to a float and store the float value in a variable a = float(number1) print(a) b = float(numString1); print(b) c = float(numString2) print(c)
Παραγωγή:
2524.0 513.523 1341.0
Στο παραπάνω παράδειγμα, ο ακέραιος και οι συμβολοσειρές μετατρέπονται σε τιμή float χρησιμοποιώντας float() και στη συνέχεια αποθηκεύονται σε μια μεταβλητή, η οποία στη συνέχεια εκτυπώνεται, εμφανίζοντας την προκύπτουσα τιμή float μετά τη μετατροπή.
Ένας άλλος τρόπος για να λάβετε τιμές float είναι εκτελώντας μαθηματικούς υπολογισμούς όπως διαίρεση, όπως φαίνεται παρακάτω:
num1 = 20 num2 = 3 result = num1/num2 print("Result of the division as an integer:") print(int(20/3)) print("Result of the division as a float value:") print(result) print(type(result))
Παραγωγή:
Result of the division as an integer: 6 Result of the division as a float value: 6.666666666666667 <class 'float'>
Στο παραπάνω παράδειγμα, παρατηρήστε ότι η τιμή float μας δίνει μια πιο ακριβή απάντηση σε σύγκριση με τη διαίρεση και τη λήψη του αποτελέσματος πίσω ως ακέραιο.
Όταν εργάζεστε με αριθμούς float στην Python, μπορεί να συναντήσετε μερικά πολύ ενδιαφέροντα αποτελέσματα λόγω του τρόπου με τον οποίο οι τιμές float αναπαρίστανται εσωτερικά στον υπολογιστή. Οι αριθμοί κινητής υποδιαστολής αντιπροσωπεύονται στο υλικό του υπολογιστή ως κλάσματα βάσης 2 (δυαδικά).
Ωστόσο, τα περισσότερα δεκαδικά κλάσματα, ιδιαίτερα εκείνα με επαναλαμβανόμενα δεκαδικά, δεν μπορούν να αναπαρασταθούν ως ακριβές δυαδικό κλάσμα. Ως αποτέλεσμα, οι αριθμοί κινητής υποδιαστολής αποθηκεύονται συνήθως ως προσέγγιση της πραγματικής τιμής.
Για να το δείτε πρακτικά, σκεφτείτε την τιμή float 0,3. Εάν αντιστοιχίσετε 0,3 σε μια μεταβλητή, εσωτερικά, δεν πρόκειται να αποθηκευτεί ως ακριβώς 0,3. Για να το δούμε αυτό, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση format() για να δούμε πώς αναπαρίσταται το 0.3 εσωτερικά. Η format() μας επιτρέπει να εμφανίζουμε έναν επιθυμητό αριθμό σημαντικών ψηφίων μιας τιμής με την οποία εργαζόμαστε. Στο παρακάτω παράδειγμα, εκτυπώνουμε 0,3 έως 20 σημαντικούς αριθμούς για να δούμε πώς αποθηκεύεται εσωτερικά.
num = 0.3 print("num to 20 significant figures") print(format(num, '.20f')) print("Value we stored for num") print(num)
Παραγωγή:
num to 20 significant figures 0.29999999999999998890 Value we stored for num 0.3
Όπως μπορείτε να δείτε, η τιμή 0,3 που αντιστοιχίσαμε σε μια μεταβλητή που ονομάζεται num, δεν αποθηκεύεται εσωτερικά ως ακριβώς 0,3. Όταν εκτυπώνετε τη μεταβλητή num, λαμβάνετε μια στρογγυλεμένη τιμή.
Λόγω αυτού του γεγονότος, ενδέχεται να έχετε κάποια απροσδόκητα αποτελέσματα όταν εργάζεστε με τιμές float. Για παράδειγμα, εάν πρόκειται να κάνετε έναν χειροκίνητο υπολογισμό 0,3 + 0,3 + 0,3, η απάντησή σας θα είναι 0,9. Ωστόσο, σύμφωνα με την Python, αυτό δεν συμβαίνει επειδή εσωτερικά, αποθηκεύει προσεγγίσεις δυαδικών κλασμάτων της πραγματικής τιμής. Αυτό φαίνεται παρακάτω:
sum = 0.3 + 0.3 + 0.3 answer = 0.9 print("Is sum equal to answer: ") print(sum == answer) print("The internal representation of of sum is: ") print(sum) print("The answer from manual calculation is: ") print(answer)
Παραγωγή:
Is sum equal to answer: False The internal representation of of sum is: 0.8999999999999999 The answer from manual calculation is: 0.9
Επομένως, όταν εργάζεστε με τιμές float, είναι σημαντικό να έχετε κατά νου ότι η Python δεν αποθηκεύει ακριβείς τιμές εσωτερικά. Αντίθετα, αποθηκεύει προσεγγίσεις της πραγματικής τιμής.
Επομένως, όταν κάνετε συγκρίσεις μεταξύ τιμών διακύμανσης, ίσως θελήσετε να στρογγυλοποιήσετε πρώτα τον αριθμό στον ίδιο αριθμό σημαντικών αριθμών. Για μεγαλύτερη ακρίβεια όταν εργάζεστε με αριθμούς κινητής υποδιαστολής στην Python, σκεφτείτε να χρησιμοποιήσετε την ενσωματωμένη δεκαδική μονάδα.
Δεκαδική ενότητα στην Python
Σε περιπτώσεις όπου η υψηλή ακρίβεια είναι σημαντική και απαραίτητο στοιχείο, όπως στους οικονομικούς και επιστημονικούς υπολογισμούς, η χρήση float δεν είναι ιδανική. Για να διασφαλιστεί η υψηλή ακρίβεια κατά την εργασία με αριθμούς κινητής υποδιαστολής, χρησιμοποιείται η ενσωματωμένη δεκαδική μονάδα Python.
Σε αντίθεση με το float που αποθηκεύεται ως δυαδικές αναπαραστάσεις κινητής υποδιαστολής που εξαρτώνται από τη μηχανή, η δεκαδική μονάδα αποθηκεύει αριθμούς κινητής υποδιαστολής χρησιμοποιώντας δεκαδική αναπαράσταση ανεξάρτητη από μηχανή που προσφέρει μεγαλύτερη ακρίβεια.
Επιπλέον, η δεκαδική ενότητα είναι σε θέση να αναπαριστά τους δεκαδικούς αριθμούς ακριβώς όπως είναι και να τους χρησιμοποιεί ακριβώς όπως είναι στους υπολογισμούς. Προσφέρει επίσης σωστά στρογγυλεμένες δεκαδικές αριθμητικές κινητής υποδιαστολής.
Για να ξεκινήσετε να χρησιμοποιείτε το δεκαδικό δομοστοιχείο, εισάγετέ το στο αρχείο Python ως εξής:
import decimal
Για να δείτε τα οφέλη της δεκαδικής ενότητας, ας επαναλάβουμε την προηγούμενη σύγκριση μεταξύ του αθροίσματος 0,3 + 0,3 + 0,3 και της τιμής 0,9. Ο κώδικας για να γίνει αυτό φαίνεται παρακάτω:
import decimal sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3') answer = decimal.Decimal('0.9') print("Is sum equal to answer: ") print(sum == answer) print("The internal representation of sum is: ") print(sum) print("The answer from manual calculation is: ") print(answer)
Παραγωγή:
Is sum equal to answer: True The internal representation of sum is: 0.9 The answer from manual calculation is: 0.9
Επομένως, όταν εργάζεστε με αριθμούς υποδιαστολής και χρειάζεστε υψηλή ακρίβεια, να θυμάστε να χρησιμοποιείτε πάντα τη δεκαδική μονάδα.
Συνήθη σφάλματα κατά την εργασία με πλωτήρες
Πολλά από τα σφάλματα που προκύπτουν όταν εργάζεστε με το Float στην Python προέρχονται από τη μη κατανόηση του τρόπου με τον οποίο οι αριθμοί σημείων κινητής αντιπροσωπεύονται εσωτερικά από την Python. Για παράδειγμα, μια τιμή όπως το 0,3 δεν θα αποθηκευτεί ακριβώς ως 0,3. Επομένως, είναι πιθανό να αντιμετωπίσετε σφάλματα εάν εργάζεστε τιμές float, υποθέτοντας ότι αποθηκεύονται ακριβώς όπως είναι.
Ένα συνηθισμένο σφάλμα είναι το σφάλμα στρογγυλοποίησης που θα συναντήσετε όταν εκτελείτε μαθηματικούς υπολογισμούς σε τιμές float. Εφόσον η Python δεν μπορεί να αναπαραστήσει τις πραγματικές τιμές float, είναι πιθανό να αντιμετωπίσετε σφάλματα στρογγυλοποίησης όπου τα αποτελέσματα μπορεί να μην είναι αυτά που περιμένετε.
Λόγω σφαλμάτων όπως τα σφάλματα στρογγυλοποίησης, είναι πιθανό να αντιμετωπίσετε σφάλματα όταν προσπαθείτε να κάνετε συγκρίσεις ισότητας μεταξύ τιμών κινητής υποδιαστολής. Να είστε πολύ προσεκτικοί όταν εργάζεστε με floats στην Python και να έχετε επίγνωση των απροσδόκητων αποτελεσμάτων.
Ένας καλύτερος τρόπος για να αποφύγετε όλα τα σφάλματα που μπορεί να προκύψουν καθώς εργάζεστε με τιμές float είναι να χρησιμοποιήσετε την ενσωματωμένη δεκαδική μονάδα. Με αυτόν τον τρόπο, τα αποτελέσματα από τους υπολογισμούς του αριθμού κινητής υποδιαστολής θα είναι πιο προβλέψιμα και ακριβή.
συμπέρασμα
Ως προγραμματιστής που εργάζεστε με την Python, είστε υποχρεωμένοι να χρησιμοποιήσετε τον τύπο δεδομένων float. Για να αποφύγετε σφάλματα με αυτόν τον τύπο δεδομένων, είναι σημαντικό να κατανοήσετε πώς η Python αντιπροσωπεύει εσωτερικά τους αριθμούς float. Εφόσον η Python δεν μπορεί να αποθηκεύσει τους πραγματικούς αριθμούς float, αποφύγετε να κάνετε ακριβείς συγκρίσεις ισότητας με τιμές float. Διαφορετικά, θα αντιμετωπίσετε σφάλματα.
Σε περίπτωση που χρειάζεστε ακριβή αποτελέσματα στην εφαρμογή σας, αποφύγετε τη χρήση τιμών float. Αντίθετα, χρησιμοποιήστε την ενσωματωμένη δεκαδική μονάδα, η οποία παρέχει ακριβή αποτελέσματα αριθμών κινητής υποδιαστολής και τα αναπαριστά ακριβώς όπως είναι και με τρόπο ανεξάρτητο από τη μηχανή.
Μπορείτε επίσης να διαβάσετε Python Itertools Functions και Python Try Except.