2012-02-14 15 views
0

これは可能ではないかもしれませんが、私はそれが尋ねることを傷つけることはできないと考えました。 私は非整数小数を8進表記に変換する必要のあるプログラムを持っています。私が知る限り、Javaは自動的に整数の8進数を扱うことができます。私はクルージングの何かを一緒に敷き詰めました。これには数を8のべき乗に分解することが含まれています。Javaで非整数8進数を解析するにはどうすればよいですか?

.abcd = X *(1/8)+ Y×(1/64)+ Z *(1/512)+ ...... 0.xyz」として表示される

"それは意味をなさない場合。問題は、長い番号の丸め/切り捨てエラーが多く発生することです。これを行うより良い方法はありますか?

(編集) は、ここで私は小数点以下の桁を処理するために使用してきたアルゴリズムです:

double floatPartNum = Double.parseDouble("0." + temps[1]); 
    if (floatPartNum > 0) { 
     int p = 1; 
     result = result + "."; 
     while (floatPartNum > 0 && p < 16) { 
      double scale = 1/(Math.pow(8, p)); 
      int modT = (int)(floatPartNum/scale); 
      result = result + modT; 
      double modScale = (double)modT * scale; 
      floatPartNum -= modScale; 
      p++; 
     } 
    } 

答えて

2

私は基本で無い浮動小数点または8進数のための固定小数点のサポートを知っていますJava。小数から8進数を抽出するためのアルゴリズムを表示すると、エラーを減らすのに役立つかもしれません。

+0

ここで私が使用しているアルゴリズムです。ポイントの左側の部分は、それが整数であるかのように扱われているので、私は唯一のポイントの右側にある数字を扱う部分を含めています: – Leonide

+0

おっと、私はリターンが ' ...物事を掲載押し忘れてしまいましたdouble floatPartNum = Double.parseDouble( "0。"+タン[1]); IF(floatPartNum> 0){ のint p = 1; 結果=結果+" ";。 一方(floatPartNum> 0 && P <16){ ダブルスケール= 1 /( Math.pow(8、P)); INT modT =(INT)(floatPartNum /スケール); 結果=結果+ modT; ダブルmodScale =(ダブル)modTの*スケール; floatPartNum - = modScale; P ++。 } } ' – Leonide

1

フロートとあなたは数のビット単位の表現を取得することができますダブルクラスでいくつかの方法があります。例えばDouble.doubleToLongBits(double)である。

その後、ダブルなどのビットから仮数部と指数部を抽出し、精度を失うことなく、あなたの進形式に変換することができます。


ただし、現在のアルゴリズムを修正する方が簡単かもしれません。私はあなたが精度を失うことなく、あなたのアプローチを実装することができるはずと考えていると思います。 (あなたは精度がすでに失われている可能性考えがあります。?つまり、最初の場所であなたの番号を生成するプロセス/計算での)

0

どのように多くのこのような何か?:多く

String result = ""; 
    double floatPartNum = temps[1]; 
    if(floatPartNum > 0) 
    { 
    int p = 1; 
    result = result + "."; 
    while(floatPartNum > 0 && p < 16) 
    { 
     floatPartNum *= 8.0D; 
     int modT = (int)floatPartNum; 
     floatPartNum -= modT; 
     result = result + modT; 

     p++; 
    } 
    } 

についてエラーを導入する操作が少なくなります。 (私はこのコードを投稿する前にこのコードをテストすることはできません。プログラミングツールの近くにはありません)

1

p < 16は人為的に出力を切り捨てています。私は1.0/3.0であなたのコードをしようとすると、私は0.252525252525252を得るが、あなたはp < 20にそれを変更した場合、0.252525252525252525を得、さらに3つの8進数を追加するための二重のに十分な精度が実際にあります。しかし、あなたが "長い数字"を心配している場合は、doubleがあなたのニーズに十分に大きくないことがわかります。

ところで、あなたのループはに、大幅に簡略化することができますようにMath.powのためのすべての必要性を排除した、

for(int p = 1; floatPartNum > 0 && p < 20; ++p) 
{ 
    floatPartNum *= 8.0; 
    result = result + (int)floatPartNum; 
    floatPartNum -= (int)floatPartNum; 
} 

(テスト)。 (Math.pow対数と指数演算を行うことで作品;。あなたはわずか8を乗じているそれはやり過ぎだし、潜在的に丸めが発生しやすい、)

関連する問題