您的位置:首页 > 职场人生

程序员面试金典: 9.5位操作5.2对一个浮点数,打印它的二进制表示

2017-01-03 12:22 423 查看
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;

/*
问题:给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"
分析:其实就是浮点数转二进制整数。十进制浮点数转二进制的规则是:将数字N乘2取整,如果计算结果R为1就退出,否则如果计算结果R>1,则取1,
并使得N=R-1;如果R<1,则取0,。
重复上述处理,直到超过指定计算次数就退出。
将取整后的数字放在"0."后面依次排列好,即为所求
输入:
0.25
0.72
输出
0.01
ERROR
*/

//将十进制小数(介于0~1之间)转化为二进制小数
vector<int> toBinarySystem(string& num)
{
vector<int> vecResult;
if(num.empty())
{
return vecResult;
}
//判断第一位是否为0,如果大于0,不符合要求
int value = num[0] - '0';
if(value > 0)
{
return vecResult;
}
//将字符串转化为小数
double dNum = atof(num.c_str());
int count = 0;

do{
if(count >= 32)
{
break;
}
dNum *= 2;
//如果结果恰好为1,将1存入结果
if( fabs(dNum - 1) < 1e-6 )
{
vecResult.push_back(1);
break;
}
else
{
if( dNum > 1)
{
dNum -= 1;
vecResult.push_back(1);
}
else
{
vecResult.push_back(0);
}
}
count++;
}while(true);
if(count >= 32)
{
vecResult.clear();
}
return vecResult;
}

int main(int argc, char*argv[])
{
string num;
while(cin >> num)
{
vector<int> vecResult = toBinarySystem(num);
if(vecResult.empty())
{
cout << "ERROR" << endl;
}
else
{
vector<int>::iterator it;
cout << "0." ;
for(it = vecResult.begin() ; it != vecResult.end() ; it++)
{
cout << (*it) ;
}
cout << endl;
}
}
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: