我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起

I wrote code to convert decimal fraction number to its binary equivalent. It compiles fine but when executed hangs

本文关键字:编译 很好 挂起 执行 二进制 代码 十进制 转换      更新时间:2023-10-16

我编写了代码将十进制分数转换为二进制等价物。它编译得很好,但在执行时挂起。此处的代码仅打印二进制转换的前四位数字,如果数字超过 4 位,则显示"..."之后。在执行时,它挂起。帮助!

#include <iostream>
using namespace std;
int main()
{
int i, x[10];
float num;
cout << "**PROGRAM TO CONVERT DECIMAL FRACTION INTO ITS EQUIVALENT BINARY**n";
cout << "Enter a fraction in between 0 to 1 for conversion: ";
cin >> num;
if (num>=0 && num<=1)
{
i=1;
while (num!=1.000)
{
num*=2;
x[i]=num;
num=num-x[i];
i++;
}
if (i>4)
{
cout << "The binary equivalent is 0.";
for (i=1;i<=4;i++)
{
cout << x[i];
}
cout << "...";
}
else
{
cout << "The binary equivalent is 0.";
for (i=1;i<=4;i++)
{
cout << x[i];
}
}
}
else
{
cout << "The number entered is out of range.";
}
return 0;
}

第一个障碍是无限 while 循环:

假设输入数字=0.5

  • 第一次迭代后,i=1, x[0]=1, num=0.0
  • 第二次迭代后,i=2, x[1]=0, num=0.0
  • 永远继续,i=..., x[i-]1=0, num=0.0

没有什么可以打破循环的。

while (num!=1.000)
{
num*=2;
x[i]=num;
num=num-x[i];
i++;
}

要修复,请考虑一些更改。可能还有其他问题。

  1. 对 while 循环施加限制(i<10 应该是一个很好的条件,因为这是x数组的大小(,或者 i=4,因为这是最大输出。
  2. while 循环的中断条件可能应该是 'num != 0',甚至更好(num> 1e-7,或其他小值(。

浮点数在尾数中有 23 位,也许是因为您分配了 x[i] 且 i 大于 9。

试试这个:

//stop when you get four bits
while (i< 5)

原始代码有几个问题:

1 对于输入 num=.5 和类似(实际上对于所有值(循环永远不会结束(dash-o 建议的修复想法(

2 数组 x[10] 溢出未定义的行为 (Edney(

3 吹毛求疵:1 不是"分数",最好检查范围 0 <= num <1 而不是 0 <= num <= 1(另见 OP 打印代码;可以添加 1(;我们可以使用 x[4] 和 0<=i <=3

也可以使用4字符串(PaulMcKenzie(。真正的">>"使用字符串处理来解析和计算二进制等价物,通过乘以 2(左狗屎(和截断小数部分,代码计算目标位。两种方法都给出了正确的相同结果;通过字符串实现,我们需要在运算符">>"实现代码中添加内部代码,以解析浮点数(小数(的有效格式,例如 3.14e-1、.2718、1e-1 等。

此修复遵循 OP:

#include <iostream>
using namespace std;
int main()
{
int i, x[5];
float num;
cout << "**PROGRAM TO CONVERT DECIMAL FRACTION INTO ITS EQUIVALENT BINARY**n";
cout << "Enter a fraction in between 0 to 1 for conversion: ";
cin >> num;
if (num>=0 && num<1)
{
i=1;
while (i<=4)
{
num*=2;
x[i]=num;
num=num-x[i];
i++;
}
cout << "The binary equivalent is 0.";
for (i=1;i<=4;i++)
{
cout << x[i];
}
if (num>0)
cout << "...";
}
else
{
cout << "The number entered is out of range.";
}
return 0;
}

这段代码没有循环(它们在代码中实现">>",位集(:

#include <iostream>
#include <bitset>
using namespace std;
int main () {
const int digits = 4;
int fraction;
float num;
cout << "**PROGRAM TO CONVERT DECIMAL FRACTION INTO ITS EQUIVALENT BINARY**n";
cout << "Enter a fraction in between 0 to 1 for conversion: ";
cin >> num;
if (num >= 0 && num < 1) {
fraction = num = num * pow (2, digits);
cout << "The binary equivalent is 0.";
cout << bitset<digits> (fraction);
if (num - fraction > 0) cout << "...";
}
else cout << "The number entered is out of range.";
}
相关文章: