Étant donné un double, besoin de trouver combien de chiffres au total

J’ai un double qui n’est pas nécessairement positif mais d’habitude. Ce peut être 0.xxxx000 ou X.xxxx00000 ou XX.00000 ou 0.xxx0xxx00000, où il y a éventuellement tous les 0 à la droite du dernier chiffre. Je dois savoir combien de chiffres il y a. J’ai eu des problèmes avec ça, une aide? C’est C.

Utilisez sprintf pour le transformer en chaîne et effectuez tous les comptages / tests nécessaires sur les chiffres

Un double contient 52 bits de mantisse plus un bit “1” implicite. Vous devriez donc pouvoir taper un double pointeur sur un entier de 64 bits (obtenir les bits bruts dans un entier), & = this with (1 << 52) -1 et | = le résultat avec (1 << 52).

Le log10 de ce serait le nombre de chiffres décimaux.

Bien que je sois presque enclin à dire “va avec la solution de jonsca” car elle est si ingénieusement simple (elle mérite un +1 dans tous les cas pour être un baiser).

La représentation du double n’est pas décimale – elle est binary (comme tous les autres nombres d’un ordinateur). Le problème que vous avez défini n’a vraiment aucun sens. Prenons l’exemple suivant: le nombre 1.2 est converti en binary – 1 + 1/5 = 1. (0011) binary [0011 en période]. Si vous le coupez à 52 bits de précision (double) – vous aurez 1.001100110011001100110011001100110011001100110011001100110011 binary qui équivaut à 1+ (1-1 / 2 ^ 52) / 5. Si vous représentez ce nombre sous forme décimale avec précision, vous obtiendrez 52 décimales avant les zéros, ce qui est beaucoup plus que la précision décimale maximale d’un double de 16 chiffres (et tous les chiffres de représentation compris entre 17 et 52 n’ont tout simplement aucun sens). .

Quoi qu’il en soit, si vous avez un problème purement abstrait (comme à l’école):

 int f( double x ) { int n = 0; x = fabs(x); x -= floor(x); while( x != floor(x) ) { x *= 2; ++n; } return n; } 

La fonction renvoie le nombre de chiffres binarys avant les zéros et le nombre de chiffres décimaux avant les zéros (le dernier chiffre décimal est toujours 5 si la valeur renvoyée est supérieure à 0).