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

C++ code to convert a fraction to binary

提问人: 提问时间:1/13/2013 更新时间:1/13/2013 访问量:2880

问:

我刚刚编写了以下 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;
C++ STL 浮点 精度

评论

1赞 emartel 1/13/2013
对于尾随,您需要将数字作为字符串处理,因为数字表示形式将不包含尾随零0
1赞 emartel 1/13/2013
@uki你已经丢失了尾随零my_float
1赞 Mr Lister 1/13/2013
@uki 是的,使用 double。和。floor
1赞 n. m. could be an AI 1/13/2013
您究竟如何解释 3.140 中的尾随零?您的程序会输出什么?此外,您的函数名称具有误导性,请调用它们并 .get_fractional_partget_integral_part
1赞 James Kanze 1/13/2013
@MrLister 而且他不应该使用 ,而是 .有一个库函数可以完全按照他的意愿行事。floormodf

答:

3赞 James Kanze 1/13/2013 #1

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

关于您的具体问题:

  1. 什么尾随?你说的是一段文字 在这里代表。在机器内部,对应相同的编号,并具有相同的表示。"0""3.5""3.50"

  2. 有一个库函数,它返回 浮点数:(除了它不是一个函数,而是一个常量)。但是如果你 想要将一个数字分解为整数和整数 零件,完全符合要求。与您的代码不同,将 实际上,对于 的所有值。std::numeric_limits<double>::digitsmodfdouble

编辑:

仔细看看你正在尝试的大局 做:我的方法是用于提取基数 2 指数,然后将数字缩放到范围 然后循环次数,每次乘以 ,并检查: 如果 乘法的结果小于 1,则插入 0 数字;否则,插入 1 位数字并减去 1。(注 如果机器,则上述所有操作都将是准确的 浮点数为基数 2,或 2 的幂。frexpldexp[0.5...1)std::numeric_limits<double>::digits2