C: Quanto tempo può durare un doppio quando viene stampato tramite printf ()

StackOverflow https://stackoverflow.com/questions/1012747

  •  06-07-2019
  •  | 
  •  

Domanda

Devo specificare la lunghezza esatta di una stringa da stampare da un doppio valore, ma non voglio limitare l'output più del necessario.

Qual è la lunghezza massima che avrà un doppio di precisione a 6 cifre se formattato da printf ()?

In particolare, quale valore devo dare a X in printf("%X.6lg",doubleValue); per garantire che nessun valore venga troncato?

Il motivo per cui devo essere specifico sulla lunghezza è che sto definendo un tipo di dati derivato MPI composto da molte rappresentazioni di stringhe di valori doppi e che devo conoscere la loro lunghezza esatta per dividere le regioni del file tra i processi MPI .

Spero sia chiaro. Grazie in anticipo per aver risposto.

È stato utile?

Soluzione

usa printf("%.6g", doubleValue) o printf("%.6Lg", doubleValue)

Notare che tralasciando le cifre iniziali (" larghezza ") nello specificatore di precisione non si richiede la lunghezza della parte integrale del valore.

Notare anche che " l " specificherà che il tuo valore è un int lungo. Il maiuscolo & Quot; L & Quot; specifica un lungo valore doppio.

Nota anche che se non vuoi che questo sia potenzialmente cambiato in notazione scientifica (se è una rappresentazione più breve), allora dovresti usare " f quot; anziché " g " ;.

Vedi a printf reference qui .

Altri suggerimenti

L'esponente massimo di un doppio IEEE è 1023, quindi il doppio più grande sarà 1 + 1/2 + 1/4 + 1/8 + ... etc * 2 ^ 1023. Che avrà una lunghezza di circa 318 caratteri, in notazione decimale.

Perché non usare " e " identificatore di formato?

C'è < float.h > contenente molti valori utili, tra cui DECIMAL_DIG, che è comunque per un long double .

Lo stesso file molto probabilmente ti dirà che un doppio sulla tua piattaforma ha più di 6 cifre di precisione ...

PS: nota anche la risposta di Demi sopra. Indica vari difetti nel tuo printf () che mi sono sfuggiti.

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