[算法很美](位运算_6)浮点实数的二进制表示
6、给定一个介于0和1之间的实数,如(0.625),类型为double,打印它的二进制表示(0.101,因为小数点后的二进制夫人你别表示0.5,0.25,0.125......
如果该数字无法精确的用32位以内的二进制表示,则打印“ERROR”
题意:这题就是考研浮点数与二进制的关系
思路:如下所示:
我们知道整数转二进制是从右往左添加,取余留商,拿15为例,操作如下
15%2=1
- 则0000 0000 0000 0001
- 15/2=7
7%2=1
- 则0000 0000 0000 0011
- 7/2=3
3%2=1
- 则0000 0000 0000 0111
- 3/2=1
1%2=1
- 则0000 0000 0000 1111
- 1/2=0
- 停止循环
那么浮点数转二进制则可以总结为:乘2取整,与整数不同的是,它是从左往右运算的,我们拿0.625为例
0.625*2=1.25
- 取整部部分,然后减去
- 0.1
- 1.25-1=0.25
0.25*2=0.5
- 取整数部分
- 0.10
0.5*2=1
- 取整数部分,然后减去
- 0.101
- 1-1=0
- 为0,停止循环
代码如下所示:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
double num;
char BinNum[34];
BinNum[0] = '0';
BinNum[1] = '.';
int i = 2;
scanf("%lf", &num);
while (num > 0)
{
num *= 2;
if (num >= 1)
{
BinNum[i] = '1';
num -= 1;
}
else
BinNum[i] = '0';
i++;
}
if (i < 34) {
BinNum[i] = '\0';
printf("%s", BinNum);
}
else {
printf("-1");
}
return 0;
}
教学视频如下所示: