5

Quando metto a punto il mio software in VS C++ facendo un passo il codice che ho notato che alcuni calcoli galleggiante si mostrano come un numero con un punto finale, vale a dire:Il punto alla fine di un galleggiante suggerisce una mancanza di precisione?

1232432. 

Un'operazione che ha portato a questo risultato è questo:

float result = pow(10, a * 0.1f)/b 

dove a è un numero negativo circa -50 a -100 e b è più spesso intorno 1. ho letto alcuni articoli sul problema con precisione quando si tratta di galleggianti punti. La mia domanda è solo se il punto finale è un modo Visual-Studio di dirmi che la precisione è molto bassa su questo numero, cioè nel risultato della variabile. In caso contrario, cosa significa?

Questo è venuto al lavoro oggi e ricordo che c'era un problema per i numeri più grandi, quindi questo accadeva ogni volta (e con "questo" intendo quel punto finale). Ma ricordo che è successo quando c'erano sette cifre nel numero. Qui si wright che la precisione dei carri allegorici sono sette cifre:

C++ Float Division and Precision

Può questo essere la cosa e Visual Studio mi dice questo mettendo un punto alla fine?

PENSO CHE L'HO TROVATO! Dice "La mantissa è specificata come una sequenza di cifre seguita da un punto". Cosa significa la mantissa? Questo può essere diverso su un PC e quando si esegue il codice su un DSP? Perché la cosa è che ottengo risultati diversi e l'unica cosa che mi sembra strana è questa cosa del periodo, dal momento che non so cosa significhi.

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx

+1

FYI '' 1.' e .1' sono validi doppie letterali in C++ (almeno gcc) – Joe

+0

ottengo quello .1 è un float/double valido ma perché non stampa lo stesso trailing. per ogni galleggiante? Se un doppio è zero, stampa 0,00000 ma solo 0 mai. Perché è il punto finale solo un paio di volte, deve essere qualcosa di speciale che si verifica per alcuni grandi numeri. –

+0

@ThomasJohansson: Avrai bisogno di parlare con il team VS, suppongo. Il punto è che non ha assolutamente nulla a che fare con la precisione di un galleggiante. Qui, dovresti sapere [questa roba] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –

risposta

3

Se ti riferisci al convegno "fichi sig" dove "4.0" significa 4 & plusmn; 0.1 e "4.00" significa 4 & plusmn; 0.01, allora no , non esiste un concetto simile in float o double. I numeri sono sempre * memorizzati con 24 o 53 bit significativi (7,22 o 15,95 cifre decimali) indipendentemente da quanti siano effettivamente "significativi".

Il punto finale è solo un punto decimale senza le cifre successive (che è un valore letterale C letterale). Essa sia significa che

  • Il valore è 1232432.0 e trimed il superfluo zero finale, OR
  • Tutto viene arrotondato a 7 cifre significative (nel qual caso il valore reale potrebbe anche essere 1232431,5, 1232431,625, 1.232.431,75, 1232431.875, 1232432.125, 1.232.432,25, 1.232.432,375 o 1.232.432,5.)

Il vera domanda è: perché stai usando float? double è il tipo "normale" in virgola mobile in C (++) e float un ottimizzazione per il risparmio di memoria.

* pedanti saranno rapidi precisare denormals, x87 80 bit valori intermedi, ecc

+0

Grazie! Ho già trovato il problema originale e sono riuscito a risolverlo ma questa è una buona spiegazione! –

+0

Tnx! Ho visto questo punto finale qui, che se non mi sbaglio, è di conseguenza utilizzato come meccanismo di trasmissione per int: int i = 10. * sqrt (n) –

3

La precisione non è variabile, che è semplicemente il modo VS la formattazione per la visualizzazione. La precisione (o mancanza di) è sempre costante per un determinato numero in virgola mobile.

+6

Anche se un punto finale può essere un suggerimento che il numero sia un numero in virgola mobile anziché un intero. – Brian

+0

@Brian: Penso che sia per questo che è lì, così capita di avere tutti gli 0 dopo il decimale. –

+0

Perché non stampa un punto alla fine di un punto mobile e non lo stampa ogni volta allo stesso punto mobile, quindi deve essere qualcosa di speciale che si verifica in un punto. Per un calcolo ho provato a calcolare il valore con la calcolatrice di Windows e differiva ... –

1

Il MSDN page è collegato a parla della sintassi di un letterale a virgola mobile nel codice sorgente. Non definisce in che modo il numero verrà visualizzato da qualsiasi strumento tu stia utilizzando. Se si stampa un numero a virgola mobile utilizzando printf o std:cout << ..., lo standard di lingua specifica come verrà stampato.

Se lo si stampa nel debugger (che sembra essere quello che si sta facendo), verrà formattato in qualsiasi modo deciso dagli sviluppatori del debugger.

ci sono un certo numero di modi diversi che un dato numero in virgola mobile possono essere visualizzati: 1.0, 1., 10.0E-001 e .1e+1 tutti significano esattamente la stessa cosa. Un trailing . in genere non ti dice nulla sulla precisione. La mia ipotesi è che gli sviluppatori del debugger usassero semplicemente 1232432. anziché 1232432.0 per risparmiare spazio.

Se si vede il trailing . per alcuni valori e un numero decimale senza . per gli altri, ciò sembra un errore tecnico (probabilmente un bug) nel debugger.

Se vi state chiedendo che cosa la precisione reale è, per IEEE a 32 bit float (il formato più computer utilizzano in questi giorni), i prossimi numeri rappresentabili prima e dopo 1232432.0 sono 1232431.875 e 1232432.125.(Otterrete molto migliore precisione utilizzando double piuttosto che float.)

Problemi correlati