正确的算法来转换二进制浮点数“1101.11”变成十进制(13.75)? [英] Correct algorithm to convert binary floating point "1101.11" into decimal (13.75)?

查看:798
本文介绍了正确的算法来转换二进制浮点数“1101.11”变成十进制(13.75)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用C编写了一个程序来转换浮点数以二进制表示 1101.11 )转换为十进制( 13.75 )。然而,我似乎无法从算法中得到正确的值。



什么是正确的方法用于将二进制浮点数转换为十进制吗?我使用的是开发CPP编译器(32位)。算法定义如下:

  void b2d(double p,double q)
{
double rem ,dec = 0,main,f,i,t = 0;
$ b $ *整数部分操作* /
while(p> = 1)
{
rem =(int)fmod(p,10);
p =(int)(p / 10);
dec = dec + rem * pow(2,t);
t ++;
}

/ *小数部分操作* /
t = 1; //赋值'1'在新操作中使用't'
while(q> 0)
{
main = q * 10;
q = modf(main,& i); (q)和整数部分(i)
dec = dec + i * pow(2,-t);
t ++;
}

printf(\\\
the decimal value =%lf\\\
,dec); //打印最终输出


int main()
{
double bin,a,f;

printf(输入要转换的二进制数:\\\
);
scanf(%lf,& bin);

/ *整数部分和小数部分的分离* /
a =(int)bin;
f = bin - a;
b2d(a,f); //函数要求转换

getch();
返回0;


解决方案

这段代码表现异常:我添加了一些简单的打印语句(b>

 $ b 

  
main = q * 10.0;
q = modf(main,& i); //分数部分(q)和整数部分(i)的提取
cout<< main =<<主要<< 压裂部分<< q<< int part<<我 ENDL;
cin.get();
dec = dec + i * pow(2,-t);
t ++;

$ / code>

当你输入1101.11时,显示如下输出:

 输入要转换的二进制数字(例如:1101.11,十进制数字为13.75):
1101.11
bin 1101.11
p 1101 q 0.11

//在上面的while循环代码中
main = 1.1压裂部分0.1 int部分1
main = 1压裂部分1 int part 0 // ^ ^^^^错误,给定main = 1,它应该输出整数部分1,小数部分0
main = 10分裂部分1 int part 9 // ^^^^^这里同样奇怪的错误,应该退出while已经是

所以你得到了错误的结果。我测试了 modf 与输入1分开,它给了正确的结果。

所以我的猜测是,你正在阅读二进制数字为double,然后尝试将这个double转换为二进制。数字的精确度可能会有些问题,但它显示它是 1101.11 。正如@Useless所建议的那样,您可能需要将数字作为字符串读取,找出小数点前后的子字符串然后将这两部分分别转换为十进制数。

I have written a program in C to convert a floating point number represented in binary (1101.11) into a decimal (13.75).

However, I cannot seem to get the correct value out of the algorithm.

What is the correct method for converting a binary floating point number into a decimal?

I am using Dev CPP compiler (32 bit). The algorithm is defined below:

void b2d(double p, double q )
{
   double rem, dec=0, main, f, i, t=0;

   /* integer part operation */    
   while ( p >= 1 )
   {
     rem = (int)fmod(p, 10);
     p = (int)(p / 10);
     dec = dec + rem * pow(2, t);
     t++;
   }

   /* fractional part operation */
   t = 1; //assigning '1' to use 't' in new operation
   while( q > 0 )
   {
     main = q * 10;
     q = modf(main, &i); //extration of frational part(q) and integer part(i)
     dec = dec+i*pow(2, -t);
     t++;
   }

   printf("\nthe decimal value=%lf\n",dec); //prints the final output
}

int main()
{
   double bin, a, f;

   printf("Enter binary number to convert:\n");
   scanf("%lf",&bin);

   /* separation of integer part and decimal part */
   a = (int)bin;
   f = bin - a;       
   b2d(a, f); // function calling for conversion

   getch();
   return 0;
}

解决方案

This piece of code behaves abnormally: I added some simple print statement

  while(q>0)
  {
     double i;
     main=q*10.0;
     q=modf(main, &i); //extration of frational part(q) and integer part(i)
     cout << "main = " << main << " frac part " << q << " int part " << i << endl;
     cin.get();
     dec=dec+i*pow(2,-t);
     t++;
  }

When you input 1101.11, the following output shown:

Enter binary number to convert(e.g: 1101.11 which will be 13.75 in decimal):
1101.11
bin in main 1101.11
p  1101 q 0.11

//inside the above while loop code
main = 1.1 frac part 0.1 int part 1
main = 1 frac part 1 int part 0  //^^^^^Error, given main=1, it should output integer part 1, fraction part 0
main = 10 frac part 1 int part 9  //^^^^^same strange error here, it should exit while already

So you got wrong result. I tested modf separately with input 1, it gave correct result.

So my guess is that you are reading the binary number as double, then tries to convert this double to binary back. There might be something going on under the hood for the precision of number though it shows that it is 1101.11. As suggested by @Useless, You may need to read the number as a string, figure out the substring before and after the decimal point . Then convert this two part into decimal separately.

这篇关于正确的算法来转换二进制浮点数“1101.11”变成十进制(13.75)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆