[算法很美](位运算_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;
}

教学视频如下所示:

本文链接:

https://nullcode.fun/104.html
1 + 7 =
快来做第一个评论的人吧~