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

Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής βάσης που έχει αποσυρθεί

Αυτό το άρθρο αφορά προϊόντα για τα οποία η Microsoft δεν παρέχει πλέον υποστήριξη. Συνεπώς, το παρόν άρθρο παρέχεται "ως έχει" και δεν θα ενημερώνεται πλέον.

Σύνοψη

Μαθηματικά κινητής υποδιαστολής είναι ένα σύνθετο θέμα που 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.


Για δυαδικό, ιδίως, μόνο κλασματικό αριθμοί που μπορεί να αναπαρασταθεί με τη φόρμα p/q, όπου ε είναι μια ακέραια δύναμη του 2, μπορούν να εκφραστούν ακριβώς, με πεπερασμένο αριθμό 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 αντιπροσωπεύουν τιμές κινητής υποδιαστολής σε τρέχουσες εκδόσεις του βασικού για τους εξής τρεις κύριους λόγους:

  1. Για να επιτρέψετε Basic, για να χρησιμοποιήσετε το coprocessors μαθηματικών Intel, που χρησιμοποιούν μορφή IEEE. Το coprocessors 80 x 87 σειράς Intel δεν μπορεί να λειτουργεί με Microsoft δυαδική μορφή αριθμών.
  2. Για να interlanguage κλήση μεταξύ Basic, C, Pascal, FORTRAN και 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 για τις ακόλουθες λέξεις:

   IEEE and floating and point and appnote


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

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

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


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


Ο στόχος του το πρότυπο IEEE, το οποίο έχει σχεδιαστεί για μηχανική υπολογισμοί, είναι η μεγιστοποίηση ακρίβεια (για να λάβετε όσο το δυνατόν ο πραγματικός αριθμός). Ακρίβεια αναφέρεται ο αριθμός των ψηφίων που μπορεί να αντιπροσωπεύει. Το πρότυπο IEEE προσπαθεί να εξισορροπήσετε τον αριθμό των bit αποκλειστικά για εκθέτη, με τον αριθμό των 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 hex
Σημείωση το 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 hex
Ίδιο πρόσημο, εκθέτης αυξάνεται κατά ένα (biased τιμή είναι 129, ή 100 0000 1 σε δυαδική μορφή.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40C 0 0000 δεκαεξαδικό
Ίδιο εκθέτης, πρόσημο είναι μεγαλύτερο από μισό--είναι (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 = 4020 0000 hex
Ακριβώς όπως 2, εκτός εάν το bit που αντιπροσωπεύει την 1/4 ορίζεται στο το πρόσημο.

1.6 = 0,1 * 2 ^ -4 = 0011 1101 1100 1100... Δεκαεξαδική CCCD 1101 = 3DCC 1100
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 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια