0

我刚刚编写了以下 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.

编辑:

仔细观察您正在尝试做的事情的大图:我的方法是使用frexp以提取 2 为底的指数,然后ldexp将数字缩放到范围 [0.5...1)然后循环std::numeric_limits<double>::digits 时间,每次乘以2,并检查:如果乘法的结果小于1,则插入0位;否则,插入 1 位并减 1。(请注意,如果机器浮点是以 2 为底或 2 的幂,则上述所有操作都是精确的。)

于 2013-01-13T13:41:19.810 回答