Domanda

Nel follow-up questa domanda, sembra che alcuni numeri non possono essere rappresentate da virgola mobile a tutti, e invece sono approssimati.

Come sono i numeri a virgola mobile memorizzati?

C'è uno standard comune per le diverse taglie?

Che tipo di problemi ho bisogno di guardare fuori per se I floating point?

Sono cross-compatibile con il linguaggio (vale a dire, quali conversioni devo affrontare per inviare un numero in virgola mobile da un programma in python per un programma in C su TCP/IP)?

-Adam

È stato utile?

Soluzione

Come accennato, il Articolo di Wikipedia su IEEE 754 fa un buon lavoro di mostrare come numeri in virgola mobile sono memorizzati su più sistemi.

Ora, qui sono alcuni trucchi:

  • Il più grande è che quasi mai si vogliono confrontare due numeri floating point per l'uguaglianza (o di disuguaglianza).Devi usare una maggiore/minore paragoni, invece.
  • Più operazioni che si fanno su di un numero in virgola mobile, il più significativo di errori di arrotondamento può diventare.
  • La precisione è limitata dalla dimensione della frazione, quindi potrebbe non essere in grado di aggiungere correttamente i numeri separati da diversi ordini di grandezza.(Per esempio, non sarà in grado di aggiungere 1E-30 di 1E30.)

Altri suggerimenti

Una spiegazione approfondita delle questioni che circondano i numeri in virgola mobile è fornita nell'articolo Quello Che Ogni Computer Scienziato Deve Sapere Circa Aritmetica A Virgola Mobile.

Lo standard è IEEE 754.

Naturalmente, ci sono altri mezzi per memorizzare i numeri quando IEE754 non è abbastanza buono.Librerie come Java BigDecimal sono disponibili per la maggior parte delle piattaforme e la mappa per bene per SQL del tipo di numero.I simboli possono essere usati per i numeri irrazionali, e i rapporti che non possono essere accuratamente rappresentati in binario o decimale in virgola mobile possono essere memorizzati in un rapporto.

Quanto alla seconda parte della tua domanda, a meno che le prestazioni e l'efficienza sono importanti per il vostro progetto, allora ti suggerisco di trasferimento di dati a virgola mobile come una stringa su TCP/IP.Questo permette di evitare problemi di tipo byte di allineamento e di facilitare il debug.

Fondamentalmente ciò che dovete preoccupare per i numeri in virgola mobile è che c'è un numero limitato di cifre di precisione.Questo può causare problemi quando si verifica l'uguaglianza, o se il vostro programma in realtà ha bisogno di più cifre di precisione rispetto a ciò che tipo di dati darvi.

In C++, una buona regola empirica è quello di pensare che un galleggiante offre 7 cifre di precisione, mentre con un doppio dà 15.Inoltre, se siete interessati a sapere come test per l'uguaglianza, si può guardare questo domanda del thread.

Nel follow-up a questa domanda, è sembra che alcuni numeri non possono essere rappresentato dalla virgola mobile a tutti, e invece sono approssimati.

Corretto.

Come sono i numeri a virgola mobile memorizzati?C'è uno standard comune per le diverse taglie?

Come altri manifesti già detto, quasi esclusivamente IEEE-754 e il suo successore IEEE754R.Google ti dà mille spiegazioni insieme con un po ' di modelli e la loro spiegazione.Se avete ancora problemi a farlo, ci sono ancora due comuni FP formati:IBM e-DIC-VAX.Per alcuni esoterico macchine e compilatori (BlitzBasic, TurboPascal) ci sono alcuni strano formati.

Che tipo di problemi ho bisogno di guardare fuori per se I floating point?Sono cross-compatibile con il linguaggio (vale a dire, quali conversioni devo affrontare per inviare un numero in virgola mobile da un programma in python per un programma in C su TCP/IP)?

Praticamente nessuno, sono cross-compatibile con il linguaggio.

Molto rari che si verificano stranezze:

  • IEEE-754 definisce sNaNs (segnalazione NaNs) e qNaNs (tranquilla NaNs).I primi causare una trappola che costringe il processore a chiamare un gestore di routine, se caricata.Queste ultime non fare questo.Perché i progettisti di linguaggi odiato la possibilità che sNaNs interrompere il flusso di lavoro e sostenere la loro applicare il supporto per le routine del gestore, sNaNs sono quasi sempre automaticamente convertite in qNaNs.Quindi non fare affidamento su un 1:1 di conversione raw.Ma di nuovo:Questo è molto raro e si verifica solo se NaNs sono presente.

  • Si possono avere problemi con le modalita ' (i byte sono nell'ordine sbagliato) se i file tra diversi computer sono condivisi.È facilmente rilevabile perché si sono sempre NaNs per i numeri.

Sì, c'è il Standard IEEE per Binario Aritmetica a virgola Mobile (IEEE 754)

Il numero è diviso in tre parti, segno, esponente e della frazione, quando sono memorizzati in formato binario.

Questo articolo intitolato "Standard IEEE 754 i Numeri in virgola Mobile" può essere utile.Per essere onesti, io non sono completamente sicuro sto capendo la tua domanda quindi non sono sicuro che questo sta per essere utile, ma spero che sarà.

Se siete davvero preoccupati per floating point errori di arrotondamento, la maggior parte dei linguaggi tipi di dati che non sono gli errori di virgola mobile.SQL Server è in Decimale e Denaro tipi di dati..Net è il tipo di dati Decimal.Essi non sono infiniti precisione come BigDecimal in Java, ma sono precisi giù per il numero di punti decimali vengono definiti per.Così non devi preoccuparti di un valore del dollaro è tipo come $4.58 ottenere salvato come un valore in virgola mobile di 4.579999999999997

Quello che mi ricordo è un 32 bit floating point è memorizzato a 24 bit per un numero reale, e rimangono 8 bit sono utilizzati come una potenza di 10, determinare il punto decimale è.

Io sono un po ' arrugginito in materia tho...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top