2010-05-03 23 views
6

Sto cercando di capire come funzionano i numeri in virgola mobile.C - arrotondamento in virgola mobile

penso che mi piacerebbe provare quello che so/necessità di imparare valutando la seguente: Vorrei trovare il più piccolo x tale che x + 1 = x, dove x è un numero in virgola mobile.

Come ho capito, ciò accadrebbe nel caso in cuiè abbastanza grande in modo che x + 1 è più vicino a x del numero successivo superiore a x rappresentabile da virgola mobile. Così intuitivamente sembra che sarebbe il caso in cui non ho abbastanza cifre nel significato e. Sarebbe questo numero x quindi essere il numero in cui il significato e tutti gli 1. Ma poi non riesco a capire quale dovrebbe essere l'esponente. Ovviamente dovrebbe essere grande (rispetto a 10^0, comunque).

+2

Come lo chiedi, meno l'infinito :-) Probabilmente vuoi il numero positivo più piccolo e non il numero più piccolo. – AProgrammer

risposta

5

Hai solo bisogno di un'espressione per il valore del bit LS nella mantissa in termini di esponente. Quando questo è> 1, hai incontrato la tua condizione. Per un singolo float di precisione il bit LS ha un valore di 2^-24 * 2^exp, quindi la condizione verrebbe soddisfatta quando exp è> 24, ovvero 25. Il numero più piccolo (normalizzato) in cui questa condizione sarebbe soddisfatta sarebbe quindi essere 1.0 * 2^25 = 33554432.0f.

Non l'ho verificato, quindi la mia matematica potrebbe essere spenta da qualche parte (ad esempio, per un fattore 2) ed è anche possibile che l'unità FP giri oltre il 24 ° bit, quindi potrebbe esserci un ulteriore fattore 2 necessario per spiegare questo, ma si ottiene l'idea generale ...

+1

oh uomo, ho letteralmente capito bene come hai postato questo! Bello! – sepiroth

+0

+1. Nota che puoi arrotondare verso + infinito, nel qual caso la risposta è + infinito. – AProgrammer

+1

In realtà, x = 2^24 è il primo float che soddisfa la condizione (qualsiasi cosa maggiore di 2^24 - 1 richiede 25 bit e quindi più di un float può contenere esattamente). –

0

Inizia con 1.0, e tenere il raddoppio fino a quando il test ha esito positivo:

double x; 
for (x = 1.0; x + 1 != x; x *= 2) { } 
printf("%g + 1 = %g\n", x, x + 1); 
+0

provarlo non vuol dire che capisco perché :) preferirei prima risolverlo. Immagino che questo post sia più in generale su come l'arrotondamento è incorporato nella matematica in virgola mobile, come evidenziato dalla domanda campione che propongo. – sepiroth

0

Suggerisco che mentre si cerca di capire i numeri fp e l'aritmetica fp si lavora in decimale con 5 cifre nel significato e 2 nell'esponente. (O, se 5 e 2 non ti soddisfa, 6 e 3 o qualsiasi altri piccoli numeri che piace.) Le questioni di:

  • la serie limitata di numeri che può essere rappresentato;
  • non commutabilità, non associatività e non distribuibilità;
  • i problemi che possono sorgere quando si trattano numeri f-p come numeri reali;

sono tutti molto più semplici da capire in decimali e le lezioni che apprendi sono del tutto generiche. Una volta capito, migliorare le tue conoscenze con l'aritmetica IEEE sarà relativamente semplice. Sarai anche in grado di capire altri sistemi di aritmetica f-p con relativa facilità.

Problemi correlati