Bonjour,

Il y a certaines choses qui m'échappent. En effet, selon la MSDN, le type double peut contenir des chiffre allant de 1.7E-308 à 1.7E+308 or par exemple dans le code suivant que je mette la variable A de type int ou double, à partir du moment ou je dépasse 10 digits donc une valeur >= 1E11, le compilateur m'insulte en me disant : "[Warning] integer constant is too large for "long" type".


De plus quand par exemple j'envoie 1E10 à la fonction NOMBRE_DE_DIGITS, il me renvoi la valeur 9 alors que je devrais avoir 10. Si je mets 1.000.000.001, il me renvoi bien 10. Problème de précision ou ma formule est fausse. J'ai testé de 1 à 10 toute les puissances de 10 et ça ne marche pas pour les valeurs comprise entre [1E10, 1.000.000.001[.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int NOMBRE_DE_DIGITS( double VALEUR, int BASE );
 
int main()
{
    float A=1000000000;
 
    int B=NOMBRE_DE_DIGITS(A, 10);
 
    printf("%d \n", B);
 
    getchar();
}
 
int NOMBRE_DE_DIGITS( double VALEUR, int BASE )
{
    if ( BASE <= 1 )
       {
              printf("\nERREUR DANS LA FONCTION NOMBRE_DE_DIGITS\n   - LA BASE NE PEUT ETRE INFERIEURE OU EGALE A 1\n");
       }
 
    if ( VALEUR == 0 || VALEUR == 1)
       {
              return 1;
       }
 
    if ( BASE > 1 )
       {
              return (floor( log(abs(VALEUR))/log(BASE) ) +1);
       }
}