(Completare) Esercitazione per informazioni di errori di virgola mobile IEEE

Traduzione articoli Traduzione articoli
Identificativo articolo: 42980 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Matematica a virgola mobile è un argomento complesso che confuses molti programmatori. L'esercitazione riportata di seguito consente di riconoscere situazioni di programmazione in cui sono probabilmente si verificano errori a virgola mobile e come evitarli. È necessario consentono inoltre di riconoscere i casi in cui sono causati da limitazioni di matematica a virgola mobile intrinseche invece di errori del compilatore effettivo.

Informazioni

Decimale e sistemi di numero binario

In genere, è il conteggio di elementi in base 10. La base è completamente arbitraria. L'unico motivo che gli utenti utilizzano tradizionalmente base 10 è 10 dita, che è state utili strumenti di conteggio.

Il numero 532.25 in decimale (base 10) indica quanto segue:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Nel sistema numerico binario (base 2), ogni colonna rappresenta una potenza di 2 anziché 10. Il numero 101.01 indica, ad esempio, quanto segue:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Come valori integer sono rappresentati nei PC

Poiché non è la parte frazionaria in un valore integer, rappresentazione in forma di computer è molto più semplice rispetto ai valori a virgola mobile. Valori integer normale su personal computer (computer) sono di 2 byte (16 bit) long con il bit più significativo che indica il segno. Valori Long integer sono di 4 byte. I valori sono numeri binari semplici positivo. Ad esempio:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Tuttavia, numeri interi negativi sono rappresentati utilizzando schema di complemento a del due. Per ottenere della due rappresentazione in complemento per un numero negativo, eseguire la rappresentazione binaria per il valore assoluto del numero e quindi capovolgere tutti i bit e aggiungere 1. Ad esempio:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Si noti che-1 Decimal = 1111 1111 1111 1111 in binario, che spiega perché Basic la considera-1 come true logico (tutti i bit = 1). Si tratta di una conseguenza derivante operatori separati per i confronti logici e bit per bit. Spesso in Basic, è opportuno utilizzare il frammento di codice seguito quando il programma effettueranno molti confronti logici. Questo semplifica notevolmente la leggibilità.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Si noti che l'aggiunta di qualsiasi combinazione di due integrano i numeri utilizzando normale aritmetica binaria produce il risultato corretto.

Problemi a virgola mobile

Ogni valore integer decimale può essere rappresentata esattamente da un valore integer binario; tuttavia, questo non è true per i numeri frazionari. In effetti, ogni numero è irrational in base 10 saranno anche irrational in un sistema con un numero minore di 10.

Binario, in particolare, i numeri solo frazionari, che possono essere rappresentati in q/p modulo, dove q è una potenza di valore integer di 2, possono essere espressa esattamente, con un numero limitato di bit.

Persino le frazioni decimali più comuni, come 0,0001, non possono essere rappresentate esattamente nel sistema binario. (0,0001 è una frazione binaria ripetuta con un periodo di 104 bit!)

Questo spiega perché un semplice esempio, come quello riportato di seguito
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

verrà PRINT 1.000054 come output. Il piccolo errore di rappresentazione di 0,0001 nel sistema binario si estende alla somma.

Per lo stesso motivo, è sempre necessario prestare particolare attenzione quando si rendono confronti sul numeri reali. Nell'esempio riportato di seguito viene illustrato un errore di programmazione comune:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

NON verrà PRINT "Uguaglianza!" dal momento che 69.82 non può essere rappresentata esattamente nel formato binario, che determina il valore risultante dall'assegnazione può essere LEGGERMENTE diverso (in formato binario) rispetto al valore generato dall'espressione. In pratica, è consigliabile codificare sempre questi confronti in modo da consentire per alcuni la tolleranza d '. Ad esempio:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Questo verrà PRINT "Uguale".

IEEE formato numeri

QuickBasic per MS-DOS, versione 3.0 è stato fornito con una versione MBF (Microsoft binario mobile Point) e una versione IEEE (Institute of Electrical and Electronics Engineers) per i computer con un coprocessore matematico. QuickBasic per MS-DOS, 4.0 e versioni successive utilizzano solo IEEE. Microsoft ha scelto lo standard IEEE per rappresentare valori a virgola mobile nelle versioni correnti di base per i seguenti tre motivi di primari:
  1. Per consentire di Basic per utilizzare il coprocessors matematiche Intel, quali utilizzare IEEE il formato. Il coprocessors 80 x 87 serie Intel non funziona con numeri in formato binario di Microsoft.
  2. Per rendere interlanguage chiamata tra Basic, C, Pascal, FORTRAN e MASM molto più semplice. Routine di conversione in caso contrario, dovrebbe essere utilizzato per inviare i valori numerici da una lingua a un'altra.
  3. Per ottenere la coerenza. IEEE è l'accettato standard, per i compilatori C e FORTRAN.
Di seguito è riportato un confronto veloce di IEEE e MBF rappresentazioni per un numero a precisione doppia:
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Per ulteriori informazioni sulle differenze tra IEEE e MBF rappresentazione a virgola mobile, ricerca le parole seguenti nella Microsoft Knowledge Base:
   IEEE and floating and point and appnote
				

Si noti che IEEE è dedicato all'esponente, il che consente di rappresentare una vasta gamma di valori in più bit. MBF ha più bit della mantissa, che consente di essere più precisi raggiungibili più ristretto.

Concetti relativi a virgola mobile generali

È molto importante tenere presente che tutti i sistemi binario a virgola mobile possono rappresentare solo un numero limitato di valori a virgola mobile in formato esatto. Tutti gli altri valori devono essere approssimate dal valore rappresentabile più vicino. Lo standard IEEE specifica il metodo di arrotondamento valori al valore rappresentabile "più vicino". QuickBasic per MS-DOS supporta lo standard e arrotondato in base alle regole IEEE.

Inoltre, tenere presente che i numeri che possono essere rappresentati in IEEE sono diffondersi in tramite un'ampia gamma. Si può immaginare loro in una riga di numero. È presente un'ad alta densità di numeri rappresentabile vicino 1.0 e-1.0 ma meno e meno come passare a 0 o infinito.

L'obiettivo dello standard IEEE che è progettato per ingegneria calcoli, è per ottimizzare la precisione (per ottenere chiudere possibili per l'effettivo numero). Precisione indica il numero di cifre che è possibile rappresentare. Lo standard IEEE tenta di bilanciare il numero di bit dedicato per l'esponente con il numero di bit utilizzati per la parte frazionaria del numero, per mantenere aggiornati accuratezza e precisione rimangano entro limiti accettabili.

Dettagli IEEE

I numeri a virgola mobile sono rappresentati nel formato seguente, dove [Esponente] è l'esponente binario:
   X =  Fraction * 2^(exponent - bias)
				

[Frazione] è la normalizzato parte di frazionaria del numero, normalizzata perché l'esponente viene regolata in modo che il bit iniziale sia sempre 1. In tal modo non deve essere memorizzato e si ottiene un bit in più di precisione. Ciò giustifica l'esistenza di un bit implicito. È possibile pensare questo come notazione scientifica, in cui è possibile manipolare l'esponente affinché una cifra a sinistra del separatore decimale, ad eccezione di in formato binario, che è sempre possibile modificare l'esponente in modo che il primo bit sia 1, poiché esistono solo 1 e 0.

[differenza] è il valore di compensazione utilizzato per evitare di dover memorizzare esponenti negativi.

La differenza per numeri a precisione singola è 127 e 1,023 (decimale) per numeri a precisione doppia.

I valori uguali per tutte le 0 e tutti 1 (binario) sono riservati che rappresentano casi speciali. Esistono anche altri casi speciali che indicano diverse condizioni di errore.

Esempi di precisione del singolo

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 0000 4000 esadecimale di =
Si noti il bit di segno è zero e l'esponente archiviato è 128 o 100 0 0000 in formato binario, ovvero 127 più 1. La mantissa archiviata è (1). 000... 0000 0000 0000, che dispone di un leader implicita binario e 1 punto, pertanto la mantissa effettiva è 1.

Tra -2 =-1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 esadecimale
Come + 2, ad eccezione del fatto che il bit di segno è impostato. Questo vale per tutti i numeri a virgola mobile IEEE di formato.

4 = 1 * 2 ^ 2 = 0100 0000... da 1000 0000 0000 0000 0000 4080 esadecimale di =
Stessa mantissa, esponente aumenta in base uno (il valore distorto è 129 o 100 0000 1 in formato binario.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 esadecimale 0000
Stesso esponente, mantissa è maggiore per metà--è 100 (1)... 0000 0000 0000, che, poiché si tratta di una frazione binaria, è 1-1/2 (i valori delle cifre frazionarie sono 1/2, 1/4 e 1/8, e così via.).

1 = 1 * 2 ^ 0 = 0011 1111... Da 1000 0000 0000 0000 = 3F80 0000 esadecimale
Stesso esponente come altre potenze di 2, mantissa è una minore di 2 a 127 o 011 1111 1 in formato binario.

1.5 * 0,75 = 2 ^ = 0011-1 1111 0100 0000... 0000 0000 = 3F40 0000 esadecimale
L'esponente distorto è 126, 011 1111 0 in binario e la mantissa è 100 (1)... 0000 0000 0000, 1-1/2.

da 1,25 * 2.5 = 2 ^ 1 = 0100 0000... 0000 0010 0000 0000 0000 4020 esadecimale di =
Esattamente come 2 tranne che il bit che rappresenta 1/4 è impostato nella mantissa.

1.6 * 0,1 = 2 ^ Da -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD esadecimale
1/10 è una frazione ripetuta in formato binario. La mantissa è appena timidi di 1,6 e l'esponente distorto indica che 1,6 deve essere diviso per 16 (è 011 1101 1 in formato binario, ovvero 123 in formato decimale). L'esponente true è 123-127 = - 4, il che significa che il fattore per il quale moltiplicare è 2 ** da -4 = 1/16. Si noti che la mantissa archiviata è arrotondata per eccesso nell'ultimo bit. Questo è un tentativo di rappresentare con precisione possibile il numero di unrepresentable. (Il motivo di 1/10 e 1/100 sono non esattamente rappresentabile in formato binario è simile a quella che è non esattamente rappresentabile in formato decimale 1/3.)

0 = 1.0 * 2 ^ da -128 = tutti zero--un caso speciale.

Altri errori di virgola mobile comuni

Gli errori a virgola mobile più comuni sono:
  1. Errore di arrotondamento

    Questo errore si verifica quando tutti i bit in un numero binario non è possibile utilizzare in un calcolo.

    Esempio: Aggiunta 0,0001 per 0.9900 (precisione singola)

    Decimale 0,0001 verranno rappresentati come:
    10100011011011100010111 (1) * 2^(-14+Bias) (13 iniziale 0 in binario!)
    0.9900 verranno rappresentati come:
    11111010111000010100011 (1) * 2^(-1+Bias)
    Ora per aggiungere effettivamente questi numeri, è necessario allineare i decimali punti (binari). Per questo devono essere Unnormalized. Di seguito è l'aggiunta risultante:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    questo viene definito un errore di arrotondamento perché alcuni computer arrotondare quando lo spostamento per l'aggiunta. Altri semplicemente troncare. Arrotondare - disattivare errori è importante prendere in considerazione ogni volta che si sta aggiungendo o moltiplicazione di due valori molto diversi.
  2. Sottrazione di due quasi uguali ai valori
           .1235
          -.1234
           _____
           .0001
    
    						
    questo verrà normalizzato. Si noti che sebbene i numeri di originali ogni quattro cifre significative, il risultato è solo una cifra significativa.
  3. Overflow e underflow

    Questo problema si verifica quando il risultato è troppo grande o troppo piccolo per essere rappresentato dal tipo di dati.
  4. Errore quantizing

    Questo problema si verifica con i numeri non possono essere rappresentati nel formato esatto dallo standard a virgola mobile.
  5. Divisione per un numero molto piccolo

    Questo può attivare un errore "divisione per zero" o può produrre risultati non validi, come nell'esempio riportato di seguito:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    QuickBasic per MS-DOS, X ora ha il valore 888887, anziché la risposta corretta, 900000.
  6. Errore di output

    Questo tipo di errore si verifica quando le funzioni di output modificano i valori che lavorano con.

Proprietà

Identificativo articolo: 42980 - Ultima modifica: martedì 16 agosto 2005 - Revisione: 3.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 per MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft Cinemania 97 Standard Edition
Chiavi: 
kbmt KB42980 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 42980
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.

Invia suggerimenti

 

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