(Ολοκληρώθηκε) Πρόγραμμα εκμάθησης για να κατανοήσετε IEEE σφαλμάτων κινητής υποδιαστολής

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 42980 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Μαθηματικά καθώς κινητής υποδιαστολής είναι ένα σύνθετο θέμα που confuses πολλά Οι προγραμματιστές. Το παρακάτω πρόγραμμα εκμάθησης θα σας βοηθήσουν να αναγνωρίσετε προγραμματισμού περιπτώσεις όπου είναι πιθανό να προκύψουν σφάλματα κινητής υποδιαστολής και τον τρόπο αποφύγετε τους. Αυτό πρέπει να επιτρέπουν επίσης να αναγνωρίζει τις περιπτώσεις που είναι προκλήθηκε από εγγενή κινητής υποδιαστολής περιορισμοί σε αντίθεση με σφάλματα μεταγλώττισης πραγματική.

Περισσότερες πληροφορίες

Υποδιαστολή και το δυαδικό σύστημα αρίθμησης

Κανονικά, καταμέτρηση πράγματα με βάση το 10. Η βάση είναι εντελώς αυθαίρετη. Το μόνο λόγο ότι άτομα έχουν χρησιμοποιείται παραδοσιακά βάσης 10 είναι ότι έχετε 10 δάχτυλα, τα οποία έχετε πραγματοποιήσει απογραφή εύχρηστη Εργαλεία.

Τον αριθμό 532.25 σε δεκαδικό (με βάση το 10), τα ακόλουθα:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Στο δυαδικό αριθμό σύστημα (με βάση το 2), κάθε στήλη αντιπροσωπεύει μια δύναμη 2 αντί για 10. Για παράδειγμα, τον αριθμό 101.01 σημαίνει την ακολουθεί:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Πώς απεικονίζονται ακέραιους αριθμούς σε υπολογιστές

Επειδή δεν υπάρχει καθόλου κλασματικό τμήμα σε ακέραιο, του υπολογιστή αναπαράσταση είναι πολύ πιο απλή από τιμές κινητής υποδιαστολής. Κανονική Οι ακέραιοι στον Προσωπικοί υπολογιστές (PC) είναι 2 byte (16 bit) με μακρύ το σημαντικότερο bit που υποδεικνύει το πρόσημο. Μεγάλη ακέραιοι είναι 4 byte. Οι θετικές τιμές είναι απλή δυαδικοί αριθμοί. Για παράδειγμα:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Ωστόσο, αντιπροσωπεύονται αρνητικούς ακέραιους αριθμούς χρησιμοποιώντας συμπλήρωμα του δύο συνδυασμός. Λήψη του δύο συμπλήρωμα αναπαράσταση για ένα αρνητικό αριθμός, λαμβάνουν δυαδική αναπαράσταση για τον αριθμό απόλυτη τιμή και όλα τα bit αναστροφή και προσθήκη 1. Για παράδειγμα:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Σημειώστε ότι η τιμή -1 δεκαδικό = 1111 1111 1111 1111 σε δυαδική μορφή, που εξηγεί Γιατί Basic αντιμετωπίζει -1 ως λογική τιμή true (όλα τα bit = 1). Αυτό είναι ένα συνέπεια της δεν χρειάζεται ξεχωριστό τελεστές για bitwise και λογική συγκρίσεις. Στη βασική, είναι συχνά χρήσιμο να χρησιμοποιήσετε το τμήμα κώδικα παρακάτω όταν το πρόγραμμα θα πραγματοποιεί πολλές λογικές συγκρίσεις. Αυτό βοηθά σημαντικά την αναγνωσιμότητα.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Σημειώστε ότι προσθέτοντας οποιονδήποτε συνδυασμό δύο του συμπλήρωμα αριθμούς μαζί χρησιμοποιούν συνήθεις δυαδικό αριθμητικό παράγει το σωστό αποτέλεσμα.

Επιπλοκές κινητής υποδιαστολής

Κάθε ακέραιος μπορεί να αναπαρασταθεί ακριβώς από δυαδική ακέραιο αριθμό. Ωστόσο, αυτό δεν ισχύει για κλασματική αριθμούς. Στην πραγματικότητα, κάθε Επίσης θα ανορθολογική σε οποιοδήποτε αριθμό είναι ανορθολογική βάσης 10 το σύστημα με βάση μικρότερο από 10.

Για δυαδικό, ιδίως, μόνο κλασματικό αριθμοί που μπορεί να όπου ε είναι μια ακέραια δύναμη του 2, μπορεί να αναπαρασταθεί από τη φόρμα p/q, ακριβώς, εκφράζεται με πεπερασμένο αριθμό bit.

Δεν μπορεί να είναι ακόμα κοινά δεκαδικά κλάσματα, όπως δεκαδικά 0,0001 αντιστοιχεί ακριβώς στο δυαδικό αρχείο. (0,0001 είναι επαναλαμβανόμενη δυαδικό κλάσμα με μια περίοδο 104 bit!)

Αυτό εξηγεί γιατί ένα απλό παράδειγμα όπως το παρακάτω:
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

θα 1.000054 ΕΚΤΎΠΩΣΗΣ ως έξοδο. Μικρό σφάλμα στο αντιπροσωπεύει 0,0001 σε δυαδική μορφή μεταδίδει το άθροισμα.

Για τον ίδιο λόγο, θα πρέπει πάντα να είστε πολύ προσεκτικοί όταν κάνετε συγκρίσεις από τους πραγματικούς αριθμούς. Το παρακάτω παράδειγμα δείχνει ένα συνηθισμένο σφάλμα προγραμματισμού:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Αυτό δεν θα ΕΚΤΥΠΩΘΕΊ "Ισότητα!", επειδή δεν μπορεί να αναπαρασταθεί 69.82 ακριβώς σε δυαδική μορφή, που προκαλεί την τιμή που προκύπτει από την ανάθεση είναι ΕΛΑΦΡΏΣ διαφορετική (σε δυαδική μορφή) από την τιμή που είναι δημιουργούνται από την έκφραση. Στην πράξη, πρέπει πάντοτε να κωδικοποιείτε τέτοιες συγκρίσεις κατά τρόπον ώστε να επιτρέπει ορισμένες ανοχής. Για παράδειγμα:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Αυτό θα ΕΚΤΥΠΏΣΕΤΕ "Ισούται με".

IEEE μορφοποίηση αριθμών

QuickBasic για MS-DOS, έκδοση 3.0 συνοδεύει ένα MBF Έκδοση (σημείο πλωτών δυαδικό αρχείο Microsoft) και ένα IEEE (ινστιτούτο Έκδοση ηλεκτρολόγων και ηλεκτρονικών μηχανικών) για υπολογιστές με ένα μαθηματικός συνεπεξεργαστής. QuickBasic για MS-DOS, 4.0 και νεότερες εκδόσεις Χρησιμοποιήστε μόνο IEEE. Η Microsoft επέλεξε το πρότυπο IEEE αντιπροσωπεύουν τιμές κινητής υποδιαστολής σε τρέχουσες εκδόσεις Basic για τα ακόλουθα τρεις κύριους λόγους:
  1. Για να επιτρέψετε Basic χρήσης coprocessors μαθηματικών Intel, το οποίο χρησιμοποιούν IEEE μορφή. Το coprocessors της σειράς Intel 80 x 87 δεν λειτουργούν με Microsoft δυαδική μορφή αριθμών.
  2. Για να κάνετε κλήση μεταξύ Basic, C, Pascal, FORTRAN, interlanguage και MASM πολύ πιο εύκολη. Διαφορετικά, οι ρουτίνες μετατροπής θα πρέπει να να χρησιμοποιηθεί για την αποστολή αριθμητικές τιμές από μια γλώσσα σε άλλη.
  3. Για την επίτευξη συνέπειας. Το IEEE είναι αποδεκτό πρότυπο για βιομηχανίας Μεταγλωττιστές c και FORTRAN.
Ακολουθεί μια γρήγορη σύγκριση αναπαραστάσεις IEEE και MBF για έναν αριθμό διπλής ακριβείας:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Για περισσότερες πληροφορίες σχετικά με τις διαφορές μεταξύ IEEE και MBF αναπαράσταση κινητής υποδιαστολής, το ερώτημα της Microsoft Knowledge Base στην Οι ακόλουθες λέξεις:
   IEEE and floating and point and appnote
				

Σημειώστε ότι ο IEEE έχει περισσότερα bit αποκλειστικά για εκθέτη, το οποίο επιτρέπει αυτό αντιπροσωπεύει ένα μεγαλύτερο εύρος τιμών. MBF έχει περισσότερα bit κλασματικού μέρους, που σας επιτρέπει να είναι ακριβέστερος εντός της περιοχής του πιο στενό.

Γενικές έννοιες κινητής υποδιαστολής

Είναι πολύ σημαντικό να γνωρίζετε ότι οποιαδήποτε δυαδικό σύστημα κινητής υποδιαστολής μπορεί να αντιπροσωπεύει έναν πεπερασμένο αριθμό κινητής υποδιαστολής τιμές σε ακριβή φόρμα. Όλες οι άλλες τιμές πρέπει να προσεγγίζεται από το πλησιέστερο η τιμή να αναπαρασταθούν. Το πρότυπο IEEE Καθορίζει τη μέθοδο για Στρογγυλοποίηση τιμών στην τιμή "πλησιέστερο" να αναπαρασταθούν. QuickBasic για MS-DOS, υποστηρίζει το πρότυπο και να στρογγυλοποιεί σύμφωνα με το πρότυπο IEEE κανόνες.

Επίσης, να θυμάστε ότι οι αριθμοί που είναι δυνατό να αναπαρασταθεί με IEEE Οι διασπορά πολύ ευρύ φάσμα. Μπορείτε να φανταστείτε τα σε ένα αριθμός γραμμής. Η υψηλή πυκνότητα να αναπαρασταθούν αριθμούς κοντά 1.0 και τιμή αλλά λιγότερες και λιγότερα ως μετάβαση προς 0 ή άπειρο.

Ο στόχος του το πρότυπο IEEE, το οποίο έχει σχεδιαστεί για μηχανική υπολογισμοί, είναι η μεγιστοποίηση ακρίβεια (για να λάβετε όσο το δυνατόν πλησιέστερα ο πραγματικός αριθμός). Ακρίβεια αναφέρεται ο αριθμός των ψηφίων που μπορεί να αντιπροσωπεύει. Το πρότυπο IEEE προσπαθεί να εξισορροπήσετε τον αριθμό των BITS αποκλειστικά για εκθέτη, με τον αριθμό των bit που χρησιμοποιούνται για την κλασματικό μέρος αριθμού, για να διατηρήσετε την ορθότητα και ακρίβεια εντός των αποδεκτών ορίων.

Λεπτομέρειες IEEE

Αριθμούς κινητής υποδιαστολής αντιπροσωπεύονται στην ακόλουθη μορφή, όπου [Εκθέτης] είναι δυαδικό Εκθέτης:
   X =  Fraction * 2^(exponent - bias)
				

[Κλάσμα] είναι κανονικοποιημένη κλασματικό μέρος αριθμού, κανονικοποίηση Επειδή ο εκθέτης ρυθμίζεται έτσι ώστε αρχικά bit είναι πάντα ένα 1. Με αυτόν τον τρόπο, δεν χρειάζεται να αποθηκευτούν και να λάβετε ένα περισσότερα bit ακρίβεια. Αυτό συμβαίνει γιατί υπάρχει μια σιωπηρή bit. Μπορείτε να θεωρήσετε Αυτό όπως επιστημονική γραφή, όπου μπορείτε να χειριστείτε σε εκθέτη έχουν ένα ψηφίο αριστερά της υποδιαστολής, εκτός σε δυαδική μορφή, μπορείτε πάντα να χειριστείτε εκθέτη, έτσι ώστε το πρώτο bit είναι 1, εφόσον υπάρχουν μόνο 1s και 0s.

[bias] είναι η τιμή πόλωσης που χρησιμοποιείται για να αποφύγετε την αποθήκευση αρνητικών εκθέτες.

Πόλωση για αριθμούς μονής ακρίβειας είναι 127 και 1023 (δεκαδική) για αριθμούς διπλής ακριβείας.

Οι τιμές ισούται με όλα τα 0 και όλα τα 1 (δυαδικό) είναι δεσμευμένα για που αντιπροσωπεύουν σε ειδικές περιπτώσεις. Υπάρχουν καθώς και άλλες ειδικές περιπτώσεις που υποδεικνύουν διάφορες συνθήκες σφάλματος.

Παραδείγματα απλής ακρίβειας

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... δεκαεξαδική 0000 0000 = 4000 0000
Σημείωση το bit πρόσημου είναι μηδέν και αποθηκευμένες εκθέτη είναι 128, ή 100 0000 0 σε δυαδική μορφή, είναι 127 συν 1. Είναι αποθηκευμένες κλασματικού μέρους (1) 000 0000... 0000 0000, η οποία έχει μια σιωπηρή 1 στην αρχή και δυαδικό σημείο, ώστε να είναι πραγματικά κλασματικού μέρους 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hex
Ίδιο με + 2 εκτός από το ότι έχει οριστεί το bit πρόσημου. Αυτό ισχύει για όλες τις Αριθμούς κινητής υποδιαστολής μορφή IEEE.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... δεκαεξαδική 0000 0000 = 4080 0000
Ίδιο κλασματικού μέρους, Εκθέτης αυξάνεται κατά ένα (η τιμή biased είναι 129, ή 100 0000 1 σε δυαδική μορφή.

6 = 1.5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Ίδιο Εκθέτης κλασματικού μέρους είναι μεγαλύτερο από μισό--είναι (1) 100 0000... 0000 0000, το οποίο, δεδομένου ότι αυτό είναι ένα δυαδικό αρχείο κλάσμα, είναι 1-1/2 (οι τιμές των δεκαδικών ψηφίων είναι 1 2, 1/4, 1 8, κ.λπ.).

1 = 1 * 2 ^ 0 = 0011 1111 1000 0000... 0000 0000 = 3F80 0000 hex
Ίδιο δυνάμεων ως άλλες εξουσίες 2 κλασματικού μέρους είναι μικρότερο από 2 127 ή 011 1111 1 σε δυαδική μορφή.

.75 = 1.5 * 2 ^ -1 = 0011 1111 0100 0000... 0000 0000 = 3F40 0000 hex
Ο εκθέτης biased είναι 126, 011 1111 0 σε δυαδική μορφή και το κλασματικού μέρους (1) 100 0000... 0000 0000 που είναι 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... δεκαεξαδική 0000 0000 0000 = 4020
Ακριβώς το ίδιο όπως 2 εκτός που είναι το bit που αντιπροσωπεύει την 1/4 Ορίστε στο κλασματικού μέρους της.

1.6 = 0,1 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 είναι επαναλαμβανόμενη κλάσμα σε δυαδική μορφή. Το κλασματικού μέρους είναι απλώς shy των 1.6, και biased εκθέτη αναφέρει ότι είναι 1.6 χωρίζεται από 16 (είναι 011 1101 1 σε δυαδική μορφή, είναι 123 στο δεκαδικό σύστημα). Η τιμή true Εκθέτης είναι 123 127 = - 4, που σημαίνει ότι ο συντελεστής που Για να πολλαπλασιάσετε είναι 2 ** -4 = 1/16. Σημειώστε ότι είναι αποθηκευμένη κλασματικού μέρους στρογγυλοποιημένο στο τελευταίο bit. Αυτή είναι μια προσπάθεια να αντιπροσωπεύουν το unrepresentable αριθμός όσο το δυνατόν ακριβέστερα. (Ο λόγος που 1/10 και 1/100 είναι ακριβώς να αναπαρασταθούν σε δυαδική μορφή παρόμοια με τον τρόπο που το 1/3 είναι ακριβώς να αναπαρασταθούν σε δεκαδική μορφή.)

0 = 1,0 * 2 ^ -128 = όλα τα μηδενικά--μια ειδική περίπτωση.

Άλλα κοινά σφάλματα κινητής υποδιαστολής

Οι παρακάτω είναι συνηθισμένα σφάλματα κινητής υποδιαστολής:
  1. Στρογγυλοποίηση σφάλμα

    Αυτό το σφάλμα προκύπτει όταν όλα τα bit σε ένα δυαδικό αριθμό δεν να χρησιμοποιηθούν σε υπολογισμούς.

    Παράδειγμα: Προσθήκη 0,0001 σε 0.9900 (απλής ακρίβειας)

    Δεκαδική 0,0001 θα αναπαρίσταται ως:
    (1) 10100011011011100010111 * 2^(-14+Bias) (13 0s στο διάστιχο Δυαδικό)!
    0.9900 που θα αναπαρίσταται ως:
    (1) 11111010111000010100011 * 2^(-1+Bias)
    Τώρα για να προσθέσετε στην πραγματικότητα αυτούς τους αριθμούς, δεκαδικούς (δυαδικό) πρέπει στοίχιση. Για αυτό πρέπει να είναι Unnormalized. Εδώ είναι το Επιπλέον που προκύπτει:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Αυτό ονομάζεται ένα σφάλμα στρογγυλοποίηση επειδή ορισμένοι υπολογιστές στρογγυλοποίηση κατά μετατόπιση για προσθήκη. Άλλοι απλώς περικοπή. Στρογγυλοποίηση σφάλματα είναι σημαντικό να εξετάσετε κάθε φορά που προσθέτετε ή πολλαπλασιασμό δύο πολύ διαφορετικές τιμές.
  2. Αν αφαιρέσετε δύο σχεδόν ίσες τιμές
           .1235
          -.1234
           _____
           .0001
    
    						
    Αυτό θα η κανονικοποίηση. Σημειώστε ότι, παρόλο που το αρχικό αριθμούς κάθε ένα είχε τέσσερα ψηφία, το αποτέλεσμα έχει μόνο μία σημαντικά ψηφία.
  3. Υπερχείλιση και υποχείλιση

    Αυτό συμβαίνει όταν το αποτέλεσμα είναι πολύ μεγάλος ή πολύ μικρός για να αντιπροσωπεύεται από τον τύπο δεδομένων.
  4. Σφάλμα quantizing

    Αυτό συμβαίνει με τους αριθμούς που δεν είναι δυνατό να αναπαρασταθεί από το ακριβές φόρμα από το πρότυπο κινητής υποδιαστολής.
  5. Διαίρεση με πολύ μικρό αριθμό

    Αυτό μπορεί να προκαλέσει ένα σφάλμα "Διαίρεση με μηδέν" ή να παράγει εσφαλμένο αποτελέσματα, όπως στο ακόλουθο παράδειγμα:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    Στο QuickBasic για MS-DOS X τώρα έχει την τιμή 888887, αντί για η σωστή απάντηση, 900000.
  6. Σφάλμα εξόδου

    Αυτός ο τύπος σφάλματος παρουσιάζεται όταν αλλάξετε τις συναρτήσεις εξόδου του εργασία με τιμές.

Ιδιότητες

Αναγν. άρθρου: 42980 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
Λέξεις-κλειδιά: 
kbmt KB42980 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:42980
Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής Βάσης (KB) που έχει αποσυρθεί
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com