Quelle est la longueur maximale en caractères nécessaires pour représenter le double de la valeur?
Quand je convertir un entier non signé de 8 bits int en string puis je sais que le résultat sera toujours au plus 3 caractères (pour 255) et pour une 8 bits signé int nous avons besoin de 4 caractères, par exemple "-128".
Maintenant, ce que je suis en train de me demander qui est la même chose pour les valeurs à virgule flottante. Quel est le nombre maximum de caractères requis pour représenter un "double" ou "float" valeur une chaîne de caractères?
Assumer régulièrement un C/C++ double (IEEE 754) et la normale de décimal de l'expansion (c'est à dire pas de %e printf mise en forme).
Je ne suis même pas sûr si c'est vraiment petit nombre (c'est à dire 0.234234) sera plus long que le très grand nombre (les doubles représentant des entiers)?
- Jalf.com, pourquoi quelqu'un mentionner que? Qui a dit qu'il est demandant comment grand d'une taille fixe de la mémoire tampon devra être? Peut-être qu'il veut savoir combien de colonnes de caractères, il doit réserve sur la console pour un texte basé sur la table.
- Sans notation scientifique, il serait long pour les valeurs extrêmes de la gamme de magnitude, mais à quoi servirait-il? Qui voudrait lire un tel nombre - un lit double (généralement) est d'environ 15 chiffres décimaux significatifs - tout le reste serait d'un grand nombre de leaders ou traiining zéros.
- Non, vous pouvez avoir plus de 15 chiffres significatifs pour les chiffres décimaux, mais seulement 15 chiffres significatifs pour l'entier. C'est parce que tandis que vous pouvez représenter tous les entiers vous ne pouvez pas représenter toutes les décimales expansions donc moins de bits peut être utilisée pour couvrir une plus grande gamme.
- Je ne suis pas l'impression de numéros pour les gens à lire, j'essaie de trouver le nécessaire char buffer de la taille nécessaire pour être sûr que l'inverse de strtod (j'.e "dtoa(double d, char* sortie)") peut finir en toute sécurité, sans risque de débordements de tampon.
- J'ai essayé avec une boucle for et multiplié le nombre tant qu'il a donné
1.#INF00
, le plus grand nombre était de 286 octets de long. Donc je suppose que vous êtes en sécurité avec 512 octets? (à l'aide de printf). - Le problème est que je ne connais pas de moyen valable de format
std::string
en utilisant la normeprintf
format. Donc, si je reçois un double, j'ai besoin de créerchar[X]
tampon.
Vous devez vous connecter pour publier un commentaire.
L'en-tête standard
<float.h>
en C, ou<cfloat>
en C++, contient plusieurs constantes à voir avec la plage et d'autres mesures de la virgule flottante types. L'un de ces estDBL_MAX_10_EXP
, la plus grande puissance de 10 exposant nécessaires pour représenter tous lesdouble
valeurs. Depuis1eN
besoinsN+1
chiffres pour représenter, et il pourrait être un signe négatif ainsi, alors la réponse estCela suppose que l'exposant est plus grand que le nombre de chiffres nécessaires pour représenter la plus grande possible de la mantisse valeur; sinon, il sera aussi un point décimal suivi par plus de chiffres.
CORRECTION
Le plus long nombre est en réalité représentable le plus faible nombre négatif: il a besoin de suffisamment de chiffres pour couvrir à la fois l'exposant et la mantisse. Cette valeur est
-pow(2, DBL_MIN_EXP - DBL_MANT_DIG)
, oùDBL_MIN_EXP
est négatif. Il est assez facile de voir (et de prouver par induction) que-pow(2,-N)
besoins3+N
caractères pour un non-scientifique de la représentation décimale ("-0."
, suivie parN
chiffres). Donc la réponse estPour un 64 bits IEEE double, nous avons
-pow(2,-N)
besoins3+N
caractères pour un non-scientifique de la représentation décimale ("-0."
, suivie parN
chiffres)."N=1
donne-0.5
(1 chiffre fractionnaire);N=2
donne-0.25
(2 chiffres); et ainsi de suite, en augmentant la par un à chaque fois.double
valeur (c'est à dire dans"%f"
format) sera pour la valeur de-DBL_MIN
(c-à -0x1p-1022, en supposant binary64 IEEE 754 est votredouble
). Pour cela, vous aurez besoin exactement 325 caractères. C'est:DBL_DIG + abs(DBL_MIN_10_EXP) + strlen("-0.")
. C'est évidemment parce qu'log10(fabs(DBL_MIN))
est de 308, qui est aussiabs(DBL_MIN_10_EXP)+1
(le +1 est parce que de le premier chiffre à gauche de la virgule), et c'est le nombre de zéros à gauche de l'chiffres significatifs.printf("%0.320lf\n", -DBL_MIN);
Selon IEEE 754-1985, la plus longue de la notation de la valeur représentée par le type double, à savoir:
a 24 caractères.
0.00000000000000000 ... approx 308 ... 00002225073858507202
==> environ 326 caractères 🙂Vous pouvez utiliser
snprintf()
pour vérifier le nombre de caractères dont vous avez besoin.snprintf()
renvoie le nombre de caractères nécessaires pour imprimer tout ce qui est transmis.Note:
snprintf()
est un C99 fonction. Si un C89 compilateur fournit comme une extension, il ne peut pas faire ce que le programme ci-dessus en attend.Modifier:
Changé le lien pour
snprintf()
à qui décrit les fonctionnalités imposées par le Standard C99; la description dans le original link est faux.2013: changement du lien retour POSIX site que je préfère sur le site de la première édition.
double value = ??;
Une bonne source d'information qui va plus dans le détail que le La norme IEEE-754 la Spécification sont ces notes de cours de l'UC Berkely à la page 4, plus un peu de BRICOLAGE calculs. Ces conférences diapositives sont également bonnes pour les étudiants en génie.
Recommandé Tailles De Tampon
Ces chiffres sont basés sur les calculs suivants:
Maximum de Décimales Comte de la Partie Intégrante
Décimal comptes sont fondés sur la formule: À la plupart de Plafond(1 + NLog_10(2)) décimales, où N est le nombre de bits dans la partie intégrante*.
Maximum Exposant Longueurs
Plus Rapide De L'Algorithme De
L'algorithme le plus rapide pour l'impression des nombres à virgule flottante est la Grisu2 algorithme détaillé dans le document de recherche L'impression des Nombres à virgule Flottante Rapidement et avec Précision. Le meilleur test que j'ai pu trouver peut être trouvé ici.
Vous pouvez contrôler le nombre de chiffres dans la représentation de chaîne lorsque vous convertissez le float/double, d'une chaîne de caractères en paramètre de la précision. Le nombre maximum de chiffres serait alors égale à la représentation de chaîne de
std::numeric_limits<double>::max()
à la précision que vous spécifiez.Donc, le plus grand nombre de chiffres dans un
double
avec une précision de 10 à 320 chiffres.Dépend de ce que tu veux dire par "représenter". Fraction décimale n'ont pas exact à virgule flottante représentation. Lorsque vous convertissez fraction décimale -> binaire fraction -> décimal, vous n'avez pas exact décimal représentations et aura du bruit bits à la fin de la représentation binaire.
La question n'implique pas de départ de nombre décimal, mais tout le code source (et la saisie de l'utilisateur) est décimal, et implique le possible problème de troncature. Ce n'est "exact" signifie dans ces circonstances?
Fondamentalement, cela dépend de votre représentation à virgule flottante.
Si vous avez 48 bits de la mantisse, cela prend environ 16 chiffres décimaux. L'exposant peut-être le reste de 14 bits (environ 5 chiffres après la virgule).
La règle de base est que le nombre de bits est environ 3x le nombre de chiffres après la virgule.
1024 n'est pas assez, le plus petit négatif double de la valeur a 1077 chiffres après la virgule. Voici le code Java.
Ici est la sortie du programme.
"Quelle est la longueur maximale en caractères nécessaires pour représenter le double de la valeur?"
La réponse exacte à cette question est: 8 caractères ASCII dans un hexadicimal format, à l'exclusion de la " 0x " préfixe - 100% de précision 🙂 (mais ce n'est pas juste une blague)
Le seuil de précision de la norme IEEE-754 double est d'environ 16 chiffres décimaux - donc à l'exclusion des fins éducatives, des représentations plus que qui sont juste un gaspillage de ressources et de puissance de calcul:
Les utilisateurs ne reçoivent pas plus informés quand ils voient un 700 chiffres sur l'écran de mesure.
Variables de Configuration stockées dans la "plus précis" formulaire sont inutiles -, toute opération sur le nombre va détruire l'exactitude. (à l'exclusion changeant le bit de signe)
Si quelqu'un a besoin de mieux réel de précision, puis il y a 80 bits de long double, avec près de 18 chiffres de l'exactitude ou de la f.e. libquadmath.
Ce qui concerne.
Le nombre maximum de caractères qui seront nécessaires pour imprimer une virgule
double
valeur (c'est à dire dans"%f"
format) sera pour la valeur de-DBL_MIN
(c-à -0x1p-1022, en supposant binary64 IEEE 754 est votredouble
). Pour cela, vous aurez besoin exactement 325 caractères. C'est:DBL_DIG + abs(DBL_MIN_10_EXP) + strlen("-0.")
. C'est évidemment parce qu'log10(fabs(DBL_MIN))
est de 308, qui est aussiabs(DBL_MIN_10_EXP)+1
(le +1 est parce que de le premier chiffre à gauche de la virgule), et c'est le nombre de zéros à gauche de l'chiffres significatifs.printf("lz = %d, sigdig = %d, dplaces = %d, dbl = %g\n", lz, sigdig, dplaces, dbl);
imprime "lz = 308, sigdig = 16, dplaces = 323, dbl = -2.22507 e-308". La sortie recevez-vous?lrint()
appel d'offre que peu de valeur par rapport à la seule(int)
. Retrait, il ajoute de la clarté.sigdig
formule est désactivée par 1 avecFLT_RADIX == 2
. Voir la définition deDBL_DECIMAL_DIG
qui est effectivement ce quesigdig
devrait être de déterminer chiffres significatifs pour tous lesdouble
. Suggérersigdig = DBL_DECIMAL_DIG;
(par exemple17
)DBL_MIN
est le plus petit de la normale.DBL_TRUE_MIN
est le plus petit non-zéro double. Bien sûr, avec l'impression de l'importance des chiffres, à l'aideDBL_MIN
suffira - que cette réponse ne.sigdig
estDBL_DECIMAL_DIG - 1
Ce n'est pas l'ambiguïté d'un ensemble de réponses à tous. Je suis à la recherche de quelque chose à dire à un C# spécificateur de format dans le but d'exercer un analyseur je suis en train de travailler sur. Je suis au hasard de générer des cas de test, y compris la double ou de la précision en virgule flottante constantes, et j'ai besoin de l'aller-retour pour être conservé. Oui, je sais qu'il est "aller-retour", qui en est un aspect. Mais j'ai aussi besoin de soutien Fixe ainsi que Scientifique notation. Jusqu'à présent j'aime
1079
mais cela ne semble pas excessif pour moi. Ou à tout le moins mon "assez proche" de la comparaison doit prendre que la variance en compte les pré/post-analyser la vérification."Pour que vous aurez besoin exactement 325 caractères"
Apparemment (et c'est un cas très commun) Vous ne comprenez pas la façon dont la conversion entre les différents numérique des bases travaux.
Peu importe le degré de précision de la définition de la DBL_MIN est, il est limité par le matériel de précision, ce qui est généralement jusqu'à 80 bits ou 18 chiffres décimaux (x86 et architectures similaires)
Pour cette raison, spécialisé en précision arbitraire-l'arithmétique des bibliothèques a été inventé, comme f.e. gmp ou de mpfr.