2011-02-04 9 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; 
} 

STDINが4の場合、99を返します。 IDEONEで100を返します。なぜですか? http://ideone.com/PPZG5C、ログ、バイナリ、および4番です。それらは混在しません

コメントで述べたように、あなたのアプローチは本当に奇妙です:

EDITはそれに2つのリターンナインで何かを

+4

これは正確にログを使用する理由は何ですか?あなたは既にバイナリで番号を*持っています。 –

+0

??助けていない – tekknolagi

+3

浮動小数点演算ルーチンの代わりにビット演算子を使用することを検討しましたか?浮動小数点は丸め誤差の対象となっていることに気が付きます。これは100の代わりに99を得る理由を説明するかもしれません。 –

答えて

2

浮動小数点演算は正確ではないが:

一般ベースn個の変換ルーチンは、のように見えます。私のマシンでは、このコードは期待通りに実行されます(STDINの4は100です)。

これを行う方法の1つは、mod(%)演算子を2の累乗で使用することです。

+0

私はそれに助けてもらえますか? – tekknolagi

+0

は2の最高出力から始めます。あなたの入力がそれより高い場合は、(ULONG_MAX/2 + 1) – levis501

+0

と思って、1を出力します。そうでなければ0を出力します。 2の最大出力で入力します。繰り返す。 – levis501

0

作品罰金以上の任意の偶数ようです。ログなど

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

これは20 ... – tekknolagi

+0

と表示され、 'else if(val

関連する問題