0

小数を対応する2進形式に変換するために、次のC++コードを記述しました。

double get_decimal_part(double num) {
   long x = static_cast<long>(num);
   return (num - static_cast<double>(x));
}

long get_real_part(double num) {
   return static_cast<long>(num);
}

string fraction_to_binary(double num) {
   string decimal_binary = "";
   double decimal_part = get_decimal_part(num);
   while ( decimal_part > 0 ) {
      double temp = decimal_part * 2;
      if ( get_real_part(temp) == 0 ) decimal_binary += "0";
      else                            decimal_binary += "1";
      decimal_part = get_decimal_part(temp); 
   }
   return decimal_binary;
}

int main() {
   cout << "3.50 - " << fraction_to_binary(3.50) << endl;
   cout << "3.14 - " << fraction_to_binary(3.14) << endl;
}

出力は次のようになります:-

3.50 - 1
3.14 - 001000111101011100001010001111010111000010100011111

私は同じことに関して次の質問があるでしょう:-

  1. 「3.50」の場合、実装は出力として「1」を返します。3.50の末尾の「0」を説明するために実装を変更するにはどうすればよいですか?
  2. 浮動小数点数の精度を取得するのに役立つライブラリ関数があった場合はどうなりますか?その情報を使って実装を変更できると思います。

[編集]また、以下を使用してフロートを文字列に変換しようとしましたが、どちらも役に立ちませんでした。

   stringstream ss;
   ss << my_float;
   cout << string(ss.str()) << endl;
4

1 に答える 1

3

具体的な質問に答える前に、これの何が問題になって modfいますか?

あなたの特定の質問に関して:

  1. 何の末尾"0"ですか?ここでは、テキスト表現について話しています。機内では、同じ番号"3.5""3.50" 対応しており、同じ表現をしています。

  2. 浮動小数点数の精度を返すライブラリ関数がありますstd::numeric_limits<double>::digits (ただし、関数ではなく定数です)。ただし、数値を整数部分と整数部分に分解したい場合はmodf、請求書に正確に適合します。そして、あなたのコードとは異なり、 のすべての値に対して実際に機能しますdouble

編集:

あなたがやろうとしていることの全体像を詳しく見てみましょう: 私のアプローチは、基数 2 の指数を抽出するために使用 しfrexp、次に数値ldexpを範囲にスケーリング することです。乗算の結果が 1 未満の場合は、0 の数字を挿入します。それ以外の場合は、1 桁を挿入して 1 を減算します (マシンの浮動小数点数が 2 を底とする、または 2 のべき乗である場合、上記のすべてのアクションが正確になることに注意してください)。[0.5...1)std::numeric_limits<double>::digits2

于 2013-01-13T13:41:19.810 に答える