用于将分数转换为二进制的C ++代码

时间:2013-01-13 12:32:10

标签: c++ stl floating-point double precision

我刚编写了以下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. 如果有任何库函数可以帮助我获得浮点数的精度?我猜我可以使用这些信息来修改我的实现。
  3. [编辑] 我也尝试使用以下命令将float转换为字符串,但它也没有帮助。

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

1 个答案:

答案 0 :(得分:3)

在回答您的具体问题之前,有什么问题 modf为此?

关于您的具体问题:

  1. 什么跟踪"0"?你在谈论一个文本 代表在这里。在计算机内"3.5""3.50" 对应于相同的数字,并具有相同的表示。

  2. 有一个库函数可以返回a的精度 浮点数:std::numeric_limits<double>::digits (除了它不是一个函数,而是一个常数)。但如果你 想要将一个数字分解为整数和整数 零件,modf完全符合要求。与你的代码不同,将会 实际工作,适用于double的所有值。

  3. 编辑:

    仔细观察你想要的更大的图片 do:我的方法是使用frexp来提取基数2 指数,然后ldexp将数字缩放到范围内 [0.5...1)然后循环std::numeric_limits<double>::digits 时间,每次乘以2,并检查:如果 乘法的结果小于1,然后插入0 数字;否则,插入1位数并减1 如果机器,所有上述操作都是准确的 浮点数为2,或2的幂。)