2011-02-04 5 views
-3
#include <stdio.h> 
#include <math.h> 
/* converts to binary using logs */ 
int main() 
{ 
    long int decimalNUM = 0, binaryNUM = 0, exponentNUM = 0; 
    printf("Enter a number to be converted to binary.\t"); 
    scanf("%ld", &decimalNUM); 
    fflush(stdin); 
    int origDEC = decimalNUM; 
     while (decimalNUM > 0) 
     { 
      exponentNUM = (log(decimalNUM))/(log(2)); 
      binaryNUM += pow(10, exponentNUM); 
      decimalNUM -= pow(2, exponentNUM); 
     } 
     printf("\nBINARY FORM OF %ld is %ld", origDEC, binaryNUM); 
    getchar(); 
    return binaryNUM; 
} 

Si STDIN vaut 4, il renvoie 99 et ne devrait pas l'être. Sur IDEONE, il renvoie 100. Pourquoi?C, les journaux, binaire et le numéro quatre. ils ne se mélangent pas

EDIT semble que tout nombre même au-dessus deux retours quelque chose avec elle dans nines

+4

Pourquoi utiliseriez-vous exactement les journaux pour cela? Vous * avez déjà * le nombre en binaire. –

+0

?? et ne pas aider – tekknolagi

+3

Avez-vous envisagé d'utiliser des opérateurs au niveau du bit au lieu des routines mathématiques en virgule flottante? Vous réalisez que le virgule flottante est sujet à des erreurs d'arrondi, ce qui pourrait expliquer pourquoi vous obtenez 99 au lieu de 100? –

Répondre

2

opérations en virgule flottante comme journal ne sont pas exactes. Sur ma machine, ce code fonctionne comme prévu (4 sur STDIN donne 100).

Une façon de procéder est d'utiliser l'opérateur mod (%) avec des puissances successives de deux.

+0

Puis-je avoir de l'aide pour ça? – tekknolagi

+0

commencez par la puissance la plus élevée de deux je pense que c'est (ULONG_MAX/2 + 1) – levis501

+0

si votre entrée est supérieure à cela, imprimez un 1, sinon imprimez un 0. Ensuite, réglez votre entrée sur le module (opérateur%) de la entrée avec la plus grande puissance de deux. Répéter. – levis501

0

fonctionne très bien: http://ideone.com/PPZG5

Comme mentionné dans les commentaires, votre approche est vraiment étrange.

Une routine de conversion de base n générale ressemble à:

void print_base_n(int val, int n) { 
    if(val==0) { printf("0"); return; } 
    else if(val < n) { printf("%d", val); return; } 
    print_base_n(val/n, n); 
    printf("%d", val % n); 
} 
+0

cela imprime 20 ... – tekknolagi

+0

il devrait dire 'else if (val

Questions connexes